scrapy爬虫框架使用流程

289 阅读1分钟

流程总结

  1. 使用Scrapy框架,创建一个爬虫项目。
>scrapy startproject Lauf
>cd Lauf
>scrapy genspider lauf domain

#要进入项目中,才可以执行如下:
scrapy crawl lauf
  1. 为项目定义数据结构,完成数据存储格式的定义。
#Lauf>items.py
class LaufItem(scrapy.Item):
	name = scrapy.Field()
	price = scrapy.Field()
	link = scrapy.Field()
  1. 编辑爬虫文件 爬虫文件,具体在项目Lauf下面的spiders目录中,有一个lauf.py。 打开编辑即可。
import scrapy
from ..items import LaufItem
class LaufSpider(scrapy.Spider):
	name = "lauf"
	allowed_domain = ["www.lauf.com"]
	start_urls = ["xxxx"]
	def parse(self,response):
		item = LaufItem()
		#匹配页面元素节点
		item["name"] = response.xpath("xxx").get()
		
		#匹配json
		json_data = json.loads(response.body_as_unicode())

		#数据交给管道
		yield item
		#新的url 交给调度器,维护请求队列
		yield scrapy.Request(url=url,callback=self.parse)
  1. 为项目定义管道,然后配置管道。
#Lauf > pipelines.py
class LaufPipeline(object):
	def process_item(self,item,spider):
		xxxx
		return item
		
  1. 全局配置文件 settings.py ,做一些全局的配置项设置。
  2. 运行爬虫,创建一个run.py文件,具体与配置文件xx.cfg是同级目录下。
from scrapy import cmdline
cmdline.execute("scrapy crawl lauf".split())

并发的爬虫

针对并发的请求,在设置下载延时的时候,也是休眠一次抓一次,串行执行。

在需要查看并发的效果时,可以不配置download延时这一项。 在这里插入图片描述

针对并发请求的多个响应, 把它们交给detail_page这个函数,开启多个协程,来处理响应的结果。解析数据、解析url。

协程

首先导入需要使用的库,具体如下:
import gevent #协程库
import time
from gevent import monkey #
monkey.patch_all() #防止一些gevent不能识别的IO操作

def func(a,b):
    time.sleep(a)   #gevent 不能识别,会串行执行,
    #可以用gevent.sleep(a)/提前monkey.patch_all()
    print("sleep %d"%a)
    
    return b

def concurrent_test():
    start_ = time.time()
    gevent.joinall([gevent.spawn(func,i,i+1) for i in [4,6,8]])
    
    print("total time:",time.time()-start_)
    
if __name__=="__main__":
    concurrent_test()