python分布式爬虫+srapy

(八)Scrapy框架(三) ?python+scrapy爬虫5

2019-08-03  本文已影响0人  栗小心

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.png

CrawlSpider页面去重

1560431542255.png

scrapy去重机制

1560431570470.png
总结:
scrapy只会将请求报文完全相同的对象视为相同请求.
对这样的相同请求对象进行过滤, 过滤原理大致为: 将请求的对象的相关信息, 如url, headers, 参数数据等.
通过单向加密加密成等长数据, 然后对加密后的数据进行对比, 来实现去重.
1560431603728.png

作业

1.使用CrawlSpider实现爬取美食网站上的相关信息,并导出为两个json数据文件, 分为基本信息json, 详情信息json.
要求:运行成功为前提,只要spider代码的截图和两个文件部分信息截图
上一篇下一篇

猜你喜欢

热点阅读