流程总结
- 使用Scrapy框架,创建一个爬虫项目。
>scrapy startproject Lauf
>cd Lauf
>scrapy genspider lauf domain
#要进入项目中,才可以执行如下:
scrapy crawl lauf
- 为项目定义数据结构,完成数据存储格式的定义。
#Lauf>items.py
class LaufItem(scrapy.Item):
name = scrapy.Field()
price = scrapy.Field()
link = scrapy.Field()
- 编辑爬虫文件 爬虫文件,具体在项目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)
- 为项目定义管道,然后配置管道。
#Lauf > pipelines.py
class LaufPipeline(object):
def process_item(self,item,spider):
xxxx
return item
- 全局配置文件 settings.py ,做一些全局的配置项设置。
- 运行爬虫,创建一个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()