Scrapy框架(三)
CrawlSpider
创建CrawlSpider
命令:
scrapy genspider -t crawl hr.tencent hr.tencent.com
url 就是你想要爬取的网址
注意:分析本地文件是一定要带上路径,scrapy shell默认当作url
Rule
Rule用来定义CrawlSpider的爬取规则
参数:
link_extractor Link Extractor对象,它定义如何从每个已爬网页面中提取链接。
callback 回调函数
cb_kwargs 是一个包含要传递给回调函数的关键字参数的dict
follow 它指定是否应该从使用此规则提取的每个响应中跟踪链接。
process_links 用于过滤连接的回调函数
process_request 用于过滤请求的额回调函数
LinkExtractor
LinkExractor也是scrapy框架定义的一个类它唯一的目的是从web页面中提取最终将被跟踪的额连接。
我们也可定义我们自己的链接提取器,只需要提供一个名为extract_links的方法,它接收Response对象并返回scrapy.link.Link对象列表。
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
class MeishiSpider(CrawlSpider):
"""
scrapy 爬静态的
CrawlSpider 在多页情况下, 已经数据为纯静态的情况 用来爬取全站数据.
Spider
"""
name = 'meishi'
allowed_domains = ['www.meishij.net']
start_urls = ['https://www.meishij.net/chufang/diy/?&page=1']
rules = (
# allow: 指定正则匹配的唯一标准, 不用把正则表达式写完整, 只要能体现唯一性且在网页源代码中匹配到的数据就是目标数据
# 这里的page=\d+ 虽然表示不能代表整个翻页的URL, 但是没关系, LinkExtractor会帮我们找到匹配项并直接获取其完整URL
# callback: Rule规则发送的后续请求, 所返回的响应应该交给谁(方法名)来进行处理
# callback不能写parse, parse会在CrawlSpider自己调用.
# follow: 首先项目开始运行后, 发送的第一批请求会被Rule进行规则检查, 若在响应的数据中匹配到相关URL, 那么就会跟进(发送)该URL
# 但是跟进的请求也会有响应, 响应中也可能会包含符合allow表达式匹配的URL. 如果想要进一步匹配这些URL并跟进, 就设置follow=True,
# 如果不想跟进就设置为False
# 前面Rule发送的请求返回的响应, 会被下面的Rule也就进行匹配, 所以若你Rule设置太多. 逻辑复杂容易出问题
# 1. 该Rule是匹配响应中的页码URL, 匹配到了就跟进请求, 若跟进的响应中也包含了页码URL, 那么就再跟进(重复的URL会自动去重)
# 直到没有匹配新的URL为止
Rule(LinkExtractor(allow=r'page=\d+'), callback='parse_item', follow=True),
# 2. 该Rule是匹配每一页菜品的详情URL, 匹配到就跟进, 跟进返回的响应交给parse_detail
Rule(LinkExtractor(allow=r'zuofa/'), callback='parse_detail', follow=False),
)
def parse_item(self, response):
"""
获取每页的菜品基本信息
:param response:
:return:
"""
# PameishiItem 该类描述的目标字段是菜品基本信息
item = PameishiItem()
node_list = response.xpath("//div[@class='listtyle1']")
for node in node_list:
item["title"] = node.xpath("./a/@title").extract_first()
item["title_url"] = node.xpath("./a/@href").extract_first()
item["title_img_url"] = node.xpath("./a/img/@src").extract_first()
item["use_time"] = node.xpath(".//ul/li[1]/text()").extract_first()
item["pattern_flavor"] = node.xpath(".//ul/li[2]/text()").extract_first()
yield item
案例实践
piplines文件
1560431483911.png 1560431511676.pngCrawlSpider页面去重
1560431542255.pngscrapy去重机制
1560431570470.png总结:
scrapy只会将请求报文完全相同的对象视为相同请求.
对这样的相同请求对象进行过滤, 过滤原理大致为: 将请求的对象的相关信息, 如url, headers, 参数数据等.
通过单向加密加密成等长数据, 然后对加密后的数据进行对比, 来实现去重.
1560431603728.png
作业
1.使用CrawlSpider实现爬取美食网站上的相关信息,并导出为两个json数据文件, 分为基本信息json, 详情信息json.
要求:运行成功为前提,只要spider代码的截图和两个文件部分信息截图
网友评论