zoukankan      html  css  js  c++  java
  • 整站爬虫

    目标爬取拉钩:

    先进入虚拟环境workon ……

    先介绍一个命令

    scrapy genspider --list
    >>>
      basic
      crawl
      csvfeed
      xmlfeed

    如果不指定默认是basic

    新建拉勾网的爬虫

    scrapy genspider -t crawl lagou www.lagou.com

    CrawlSpider是scrapy提供一个通用Spider。在Spider里面,我们可以指定一些爬取规则来实现页面的提取,这些爬取规则由一个专门的数据结构Rule表示。Rule里面包含提取和跟进页面的配置,Spider会根据Rule来确定当前页面中的哪些连接需要继续爬取,哪些页面的爬取结果需要用哪个方法解析等。

    rules = (
            Rule(LinkExtractor(allow=r'Items/'), callback='parse_job', follow=True),
        )

    实例化类,回调函数就是类的方法名称的字符串形式。

    CrawlSpider继承自Spider类。除了Spider类的所有方法和属性,他提供了一个非常重要的属性和方法。

    1,rules,他是爬取规则属性,是包含一个或多个Rule对象的列表。每个Rule对爬取网站的动作都做了定义,CrawlSpider会读取rules的每一个Rule并进行解析。

    2,parse_start_url(),他是一个可以重写的方法,当start_urls对应的Ruquest得到Response时,该方法被调用,他会分析Response并必须返回Item对象或者Request对象。

    这里最重要的内容莫过于Rule的定义了,他的定义和参数如下所示:

    class Rule(object):
    
        def __init__(self, link_extractor, callback=None, cb_kwargs=None, follow=None, process_links=None, process_request=identity):
            self.link_extractor = link_extractor
            self.callback = callback
            self.cb_kwargs = cb_kwargs or {}
            self.process_links = process_links
            self.process_request = process_request
            if follow is None:
                self.follow = False if callback else True
            else:
                self.follow = follow

     首先定义item要提取的字段

    class LagouJobItem(scrapy.Item):
        #拉勾网职位
        title = scrapy.Field()
        url = scrapy.Field()
        salary = scrapy.Field()
        job_city = scrapy.Field(
            input_processor=MapCompose(replace_splash),
        )
        work_years = scrapy.Field(
            input_processor=MapCompose(replace_splash),
        )
        degree_need = scrapy.Field(
            input_processor=MapCompose(replace_splash),
        )
        job_type = scrapy.Field()
        publish_time = scrapy.Field()
        job_advantage = scrapy.Field()
        job_desc = scrapy.Field(
            input_processor=MapCompose(handle_strip),
        )
        job_addr = scrapy.Field(
            input_processor=MapCompose(remove_tags, handle_jobaddr),
        )
        company_name = scrapy.Field(
            input_processor=MapCompose(handle_strip),
        )
        company_url = scrapy.Field()
        crawl_time = scrapy.Field()
        crawl_update_time = scrapy.Field()
    
        def get_insert_sql(self):
            insert_sql = """
                insert into lagou_job(title, url, salary, job_city, work_years, degree_need,
                job_type, publish_time, job_advantage, job_desc, job_addr, company_url, company_name, job_id)
                VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s) ON DUPLICATE KEY UPDATE job_desc=VALUES(job_desc)
            """
    
            job_id = extract_num(self["url"])
            params = (self["title"], self["url"], self["salary"], self["job_city"], self["work_years"], self["degree_need"],
                      self["job_type"], self["publish_time"], self["job_advantage"], self["job_desc"], self["job_addr"], self["company_url"],
                      self["company_name"], job_id)
    
            return insert_sql, params
  • 相关阅读:
    ArcGIS学习记录—union、merge及append的区别
    ArcGIS学习记录—属性表的编辑与修改
    ASP.NET应用程序和ASP.NET网站所共有的文件: App_Browsers 等
    C# 文件夹操作
    远程重启服务器
    SQL省市区三级表结构
    c#提出中文首字母
    javascript遍历Json对象个数
    原生javascript添加引用js文件
    简单的div蒙层
  • 原文地址:https://www.cnblogs.com/zhoulixiansen/p/10029050.html
Copyright © 2011-2022 走看看