scrapy数据流程
- 调度器—》request—》引擎—》下载中间件—》下载器
- 下载器发送请求,获取resposne,—》response—>下载中间件—》引擎—》爬虫中间件—》spider
- spider 提取数据—》引擎—》pipeline
- spider 提取url地址–》构造request—》爬虫中间件—》引擎—》调度器
scrapy的使用流程
- 创建项目
scrapy startproject mySpider
- 示例:
scrapy startproject spider_project
- 示例:
生成一个爬虫
scrapy genspider 爬虫名 要爬的网址(不带http)
一般都是主网址- 示例:
cd spider_project/
scrapy genspider xiaohua www.xiaohuar.com
- 示例:
- 带分页的创建方法
scrapy genspider -t crawl tencent hr.tencent.com
- 程序启动方法
scrapy crawl yangguang
提取数据
完善爬虫
- start_url,response –> parse
- 数据yield 通过传递给管道
- 能够yield 的数据类型,dict,request,Item,None
1
2
3
4
5
6
7
8
9
10
11
12resp = response.xpath('//div[@class="item masonry_brick"]')
for i in resp:
item = XiaohuaItem()
item['name'] = i.xpath('.//span[@class="price"]/text()').extract_first()
item['title'] = i.xpath('.//span/a/text()').extract_first()
item['num'] = i.xpath('.//em[@class="bold"]/text()').extract_first()
img_url = i.xpath('.//a/img/@src').extract_first()
if not img_url.startswith('https'):
img_url = 'http://www.xiaohuar.com/'+img_url
item['img_url'] = img_url
# print(data)
yield item
设置user_agent
- `USER_AGENT = ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.63 Safari/537.36 Qiyu/2.1.1.1’
管道
- 开启管道
- 开启管道,键:位置,值:距离引擎的远近,越小越近,说句越先经过
- 打开item_pipelines
1
2'spider_project.pipelines.SpiderProjectPipeline': 300,
}
- 开启管道
进入items,设置字段名
1
2
3
4
5
6class XiaohuaItem(scrapy.Item):
# define the fields for your item here like:
name = scrapy.Field()
title = scrapy.Field()
num = scrapy.Field()
img_url = scrapy.Field()进入pipelines,存储数据到mongodb
- 创建数据库连接
client = pymongo.MongoClient()
client = client['1807b']['xiaohua']
简写
client = pymongo.MongoClient()['1807b']['xiaohua']
入库
1
2
3
4class SpiderProjectPipeline(object):
def process_item(self, item, spider):
client.insert(dict(item))
return item
- 创建数据库连接
scrapy如何发送请求,能够携带什么参数
- scrapy.Request(url,callback,meta,dont_filter)
- dont_filter=True 表示请求过的url地址还会继续被请求
scrapy如何把数据从一个解析函数传递到另一个,为什么需要这样做
- meta是个字典类型,meta = {“item”:item}
- response.meta[“item”]
scrapy中Item是什么,如何使用
- Item 类,继承自scarpy.Item,name=scrapy.Field()
- Item 定义那些字段我们需要抓取
- 使用和字典一样
- 在mongodb中插入数据的时候 dict(item)
pipeline中open_spider和close_spider是什么
- open_spdier 爬虫开启执行一次,只有一次
- close_spider 爬虫关闭的时候执行一次,只有一次
v1.5.2