美文网首页
Python爬虫学习18-通过CrawlSpider爬取数据

Python爬虫学习18-通过CrawlSpider爬取数据

作者: MingSha | 来源:发表于2017-04-25 18:01 被阅读0次

    爬取一般网站常用的spider。其定义了一些规则(rule)来提供跟进link的方便的机制。 也许该spider并不是完全适合您的特定网站或项目,但其对很多情况都使用。 因此您可以以其为起点,根据需求修改部分方法。当然您也可以实现自己的spider。
    除了从Spider继承过来的(您必须提供的)属性外,其提供了一个新的属性:rules

    一个包含一个(或多个) [Rule]对象的集合(list)。 每个 [Rule]对爬取网站的动作定义了特定表现。 Rule对象在下边会介绍。 如果多个rule匹配了相同的链接,则根据他们在本属性中被定义的顺序,第一个会被使用。

    该spider也提供了一个可复写(overrideable)的方法:parse_start_url(*response*)
    当start_url的请求返回时,该方法被调用。 该方法分析最初的返回值并必须返回一个 [Item]对象或者 一个 [Request]对象或者 一个可迭代的包含二者对象。
    建立爬虫的方法为:

    scrapy genspider -t crawl lagou www.lagou.com
    

    在生成的页面中

    # -*- coding: utf-8 -*-
    import scrapy
    from scrapy.linkextractors import LinkExtractor
    from scrapy.spiders import CrawlSpider, Rule
    from scrapy.loader import ItemLoader
    from items import LagouJobItem, LagouJobItemLoader
    from utils.common import get_md5
    import datetime
    
    class LagouSpider(CrawlSpider):
        name = 'lagou'
        allowed_domains = ['www.lagou.com']
        start_urls = ['https://www.lagou.com/']
    
        rules = (
            # 提取匹配 'category.php' (但不匹配 'subsection.php') 的链接并跟进链接(没有callback意味着follow默认为True)
            Rule(LinkExtractor(allow=('www.lagou.com/zhaopin/Java/',), )),
    
            # 提取匹配 'item.php' 的链接并使用spider的parse_item方法进行分析
            Rule(LinkExtractor(allow=('www.lagou.com/jobs/',)), callback='parse_job'),
        )
    
        def parse_job(self, response):
            item_loader = LagouJobItemLoader(item=LagouJobItem(), response=response)
            item_loader.add_css("title", ".job-name span::text")
            item_loader.add_value("url", response.url)
            item_loader.add_value("url_object_id", get_md5(response.url))
            item_loader.add_xpath("job_city", "//*[@class='job_request']/p/span[2]/text()")
            item_loader.add_xpath("work_years", "//*[@class='job_request']/p/span[3]/text()")
            item_loader.add_xpath("degree_need", "//*[@class='job_request']/p/span[4]/text()")
            item_loader.add_xpath("job_type", "//*[@class='job_request']/p/span[5]/text()")
            item_loader.add_css("salary", ".job_request .salary::text")
            item_loader.add_css("publish_time", ".publish_time::text")
            item_loader.add_css("job_advantage", ".job-advantage p::text")
            item_loader.add_css("job_desc", ".job_bt div")
            item_loader.add_css("job_addr", ".work_addr")
            item_loader.add_css("tags", ".position-label .labels::text")
    
            item_loader.add_css("company_url", "#job_company dt a::attr(href)")
            item_loader.add_css("company_name", "#job_company dt a div h2::text")
            item_loader.add_value("crawl_time", datetime.datetime.now())
    
            job_item = item_loader.load_item()
    
            yield job_item
    

    相关文章

      网友评论

          本文标题:Python爬虫学习18-通过CrawlSpider爬取数据

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