美文网首页python分布式爬虫+srapy
(八)Scrapy框架(三) ?python+scrapy爬虫5

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

作者: 栗小心 | 来源:发表于2019-08-03 19:21 被阅读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代码的截图和两个文件部分信息截图
    

    相关文章

      网友评论

        本文标题:(八)Scrapy框架(三) ?python+scrapy爬虫5

        本文链接:https://www.haomeiwen.com/subject/chksdctx.html