scrapy数据建模与请求
学习目标:
- 应用 在scrapy项目中进行建模
- 应用 构造Request对象,并发送请求
- 应用 利用meta参数在不同的解析函数中传递数据
- scrapy构造post请求
1. 数据建模
通常在做项目的过程中,在items.py中进行数据建模
1.1 为什么建模
- 定义item即提前规划好哪些字段需要抓,防止手误,因为定义好之后,在运行过程中,系统会自动检查
- 配合注释一起可以清晰的知道要抓取哪些字段,没有定义的字段不能抓取,在目标字段少的时候可以使用字典代替
1.2 如何建模
在items.py文件中定义要提取的字段:
# Define here the models for your scraped items
# See documentation in:
# https://docs.scrapy.org/en/latest/topics/items.html
import scrapy
class DoubanItem(scrapy.Item):
# define the fields for your item here like:
name = scrapy.Field() # 名字
content = scrapy.Field() # 内容
link = scrapy.Field() # 链接
txt = scrapy.Field() #详情介绍
1.3 如何使用模板类
模板类定义以后需要在爬虫中导入并且实例化,之后的使用方法和使用字典相同
爬虫文件.py
# -*- coding:utf-8 -*-
import scrapy
from douban.items import DoubanItem
....
def parse(self, response):
name = response.xpath('//h2[@class="clearfix"]/a/text()').extract()
content = response.xpath('//p[@class="subject-abstract color-gray"]/text()').extract()
link = response.xpath('//h2[@class="clearfix"]/a/@href').extract()
for names, contents, links in zip(name, content, link):
item = DoubanItem() # 实例化后拿到模板类就可直接使用 本质是一个字典
item['name'] = names
item['content'] = contents.strip()
item['link'] = links
注意:
1. from douban.items import DoubanItem这一行代码中 注意item的正确导入路径,忽略pycharm标记的错误
2. python中的导入路径要诀:从哪里开始运行,就从哪里开始导入
1.4 开发流程总结
1. 创建项目
scrapy startproject 项目名
2. 明确目标
在items.py文件中进行建模 (一般来说在开发流程里建模是必须的,但如果字段特别少也可以选择忽略)
3. 创建爬虫
3.1 创建爬虫
scrapy genspider 爬虫名 允许的域
3.2 完成爬虫
修改start_urls
检查修改allowed_domains
在parse方法里编写解析方法
4. 保存数据
在pipelines.py文件中定义对数据处理的管道
在settings.py文件中注册启用管道
2. 翻页请求的思路
- 找到下一页的url地址
- 把url地址构造成请求对象,传递给引擎
3. 构造Request对象,并发送请求
3.1 实现方法
- 确定url地址
- 构造请求,scrapy.Request(url,callback)
- callback:指定响应体解析的函数名称,表示该请求返回的响应使用哪一个函数进行解析(callback不赋值的话默认是给parse方法解析)
- 把请求交给引擎:yield scrapy.Request(url,callback)
3.2 豆瓣新书速递爬虫
通过爬取豆瓣新书速递的页面信息,学习如何实现翻页请求
地址:豆瓣新书速递
思路分析:
- 获取首页的响应数据(因为里面有我们想要的翻页链接)
- 寻找下一页的地址,进行翻页,获取数据
注意:
-
可以在settings中设置ROBOTS协议
False表示忽略网站的robots.txt协议,默认为True
ROBOTSTXT_OBEY = False
-
可以在settings中设置User-Ag