CrawlSpider继承Spider,提供了强大的爬取规则(Rule)供使用

填充custom_settings,浏览器中的请求头

  1. from datetime import datetime
  2. import scrapy
  3. from scrapy.linkextractors import LinkExtractor
  4. from scrapy.spiders import CrawlSpider, Rule
  5. from ArticleSpider.items import LagouJobItem, LagouJobItemLoader
  6. from ArticleSpider.utils.common import get_md5
  7. class LagouSpider(CrawlSpider):
  8. name = 'lagou'
  9. allowed_domains = ['www.lagou.com']
  10. start_urls = ['https://www.lagou.com/']
  11. custom_settings = {
  12. }
  13. rules = (
  14. Rule(LinkExtractor(allow=("zhaopin/.*",)), follow=True),
  15. Rule(LinkExtractor(allow=("gongsi/j\d+.html",)), follow=True),
  16. Rule(LinkExtractor(allow=r'jobs/\d+.html'), callback='parse_job', follow=True),
  17. )
  18. def parse_job(self, response):
  19. # 解析拉勾网的职位
  20. item_loader = LagouJobItemLoader(item=LagouJobItem(), response=response)
  21. item_loader.add_css("title", ".job-name::attr(title)")
  22. item_loader.add_value("url", response.url)
  23. item_loader.add_value("url_object_id", get_md5(response.url))
  24. item_loader.add_css("salary", ".job_request .salary::text")
  25. item_loader.add_xpath("job_city", "//*[@class='job_request']/p/span[2]/text()")
  26. item_loader.add_xpath("work_years", "//*[@class='job_request']/p/span[3]/text()")
  27. item_loader.add_xpath("degree_need", "//*[@class='job_request']/p/span[4]/text()")
  28. item_loader.add_xpath("job_type", "//*[@class='job_request']/p/span[5]/text()")
  29. item_loader.add_css("tags", '.position-label li::text')
  30. item_loader.add_css("publish_time", ".publish_time::text")
  31. item_loader.add_css("job_advantage", ".job-advantage p::text")
  32. item_loader.add_css("job_desc", ".job_bt div")
  33. item_loader.add_css("job_addr", ".work_addr")
  34. item_loader.add_css("company_name", "#job_company dt a img::attr(alt)")
  35. item_loader.add_css("company_url", "#job_company dt a::attr(href)")
  36. item_loader.add_value("crawl_time", datetime.now())
  37. job_item = item_loader.load_item()
  38. return job_item
  1. class LagouJobItemLoader(ItemLoader):
  2. #自定义itemloader
  3. default_output_processor = TakeFirst()
  4. class LagouJobItem(scrapy.Item):
  5. #拉勾网职位信息
  6. title = scrapy.Field()
  7. url = scrapy.Field()
  8. url_object_id = scrapy.Field()
  9. salary = scrapy.Field()
  10. job_city = scrapy.Field(
  11. input_processor=MapCompose(remove_splash),
  12. )
  13. work_years = scrapy.Field(
  14. input_processor = MapCompose(remove_splash),
  15. )
  16. degree_need = scrapy.Field(
  17. input_processor = MapCompose(remove_splash),
  18. )
  19. job_type = scrapy.Field()
  20. publish_time = scrapy.Field()
  21. job_advantage = scrapy.Field()
  22. job_desc = scrapy.Field()
  23. job_addr = scrapy.Field(
  24. input_processor=MapCompose(remove_tags, handle_jobaddr),
  25. )
  26. company_name = scrapy.Field()
  27. company_url = scrapy.Field()
  28. tags = scrapy.Field(
  29. input_processor = Join(",")
  30. )
  31. crawl_time = scrapy.Field()
  32. def get_insert_sql(self):
  33. insert_sql = """
  34. insert into lagou_job(title, url, url_object_id, salary, job_city, work_years, degree_need,
  35. job_type, publish_time, job_advantage, job_desc, job_addr, company_name, company_url,
  36. tags, crawl_time) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)
  37. ON DUPLICATE KEY UPDATE salary=VALUES(salary), job_desc=VALUES(job_desc)
  38. """
  39. params = (
  40. self["title"], self["url"], self["url_object_id"], self["salary"], self["job_city"],
  41. self["work_years"], self["degree_need"], self["job_type"],
  42. self["publish_time"], self["job_advantage"], self["job_desc"],
  43. self["job_addr"], self["company_name"], self["company_url"],
  44. self["job_addr"], self["crawl_time"].strftime(SQL_DATETIME_FORMAT),
  45. )
  46. return insert_sql, params
  1. SET FOREIGN_KEY_CHECKS=0;
  2. -- ----------------------------
  3. -- Table structure for lagou_job
  4. -- ----------------------------
  5. DROP TABLE IF EXISTS `lagou_job`;
  6. CREATE TABLE `lagou_job` (
  7. `title` varchar(255) NOT NULL,
  8. `url` varchar(255) NOT NULL,
  9. `url_object_id` varchar(50) NOT NULL,
  10. `salary` varchar(20) DEFAULT NULL,
  11. `job_city` varchar(255) DEFAULT NULL,
  12. `work_years` varchar(255) DEFAULT NULL,
  13. `degree_need` varchar(255) DEFAULT NULL,
  14. `job_type` varchar(255) DEFAULT NULL,
  15. `tags` varchar(255) DEFAULT NULL,
  16. `publish_time` varchar(20) NOT NULL,
  17. `job_advantage` varchar(255) DEFAULT NULL,
  18. `job_desc` longtext NOT NULL,
  19. `job_addr` varchar(255) DEFAULT NULL,
  20. `company_name` varchar(255) DEFAULT NULL,
  21. `company_url` varchar(255) DEFAULT NULL,
  22. `crawl_time` datetime NOT NULL,
  23. `crawl_update_time` datetime DEFAULT NULL,
  24. PRIMARY KEY (`url_object_id`)
  25. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CrawlSpider爬取拉钩的更多相关文章

  1. 21天打造分布式爬虫-Selenium爬取拉钩职位信息(六)

    6.1.爬取第一页的职位信息 第一页职位信息 from selenium import webdriver from lxml import etree import re import time c ...

  2. Python 爬取 拉钩

    ... from urllib import request from urllib import parse from urllib.error import URLError import jso ...

  3. python3爬取拉钩招聘数据

    使用python爬去拉钩数据 第一步:下载所需模块 requests 进入cmd命令 :pip install requests 回车 联网自动下载 xlwt 进入cmd命令 :pip install ...

  4. 使用request爬取拉钩网信息

    通过cookies信息爬取 分析header和cookies 通过subtext粘贴处理header和cookies信息 处理后,方便粘贴到代码中 爬取拉钩信息代码 import requests c ...

  5. 爬取拉钩网上所有的python职位

    # 2.爬取拉钩网上的所有python职位. from urllib import request,parse import json,random def user_agent(page): #浏览 ...

  6. 使用nodejs爬取拉勾苏州和上海的.NET职位信息

    最近开始找工作,本人苏州,面了几家都没有结果很是伤心.在拉勾上按照城市苏州关键字.NET来搜索一共才80来个职位,再用薪水一过滤,基本上没几个能投了.再加上最近苏州的房价蹭蹭的长,房贷压力也是非常大, ...

  7. Scrapy框架——CrawlSpider爬取某招聘信息网站

    CrawlSpider Scrapy框架中分两类爬虫,Spider类和CrawlSpider类. 它是Spider的派生类,Spider类的设计原则是只爬取start_url列表中的网页, 而Craw ...

  8. Python3 Scrapy + Selenium + 阿布云爬取拉钩网学习笔记

    1 需求分析 想要一个能爬取拉钩网职位详情页的爬虫,来获取详情页内的公司名称.职位名称.薪资待遇.学历要求.岗位需求等信息.该爬虫能够通过配置搜索职位关键字和搜索城市来爬取不同城市的不同职位详情信息, ...

  9. selelinum+PhantomJS 爬取拉钩网职位

    使用selenium+PhantomJS爬取拉钩网职位信息,保存在csv文件至本地磁盘 拉钩网的职位页面,点击下一页,职位信息加载,但是浏览器的url的不变,说明数据不是发送get请求得到的. 我们不 ...

随机推荐

  1. H5上传图片之canvas

    H5上传图片之canvas,使用canvas处理压缩图片再上传 html代码: <form action="" method="post"> < ...

  2. jmeter分布式压测(多台电脑一起压测)

    (1)在Windows下运行 操作步骤: 1)     有多台电脑,每台电脑上都有jmeter,而且这几台电脑都互相能ping通. 2)     在我的电脑的jmeter的配置文件bin目录下的jme ...

  3. excel vba 不可查看

    打击共享工作簿 去掉[允许多用户同事编辑,同事允许工作簿合并]

  4. Dockers 学习

    Docker镜像操作,有五个常用的命令: a.拉取镜像,后跟镜像仓库名称,如果要指定某个版本,可以带上tag. > docker pull <repo>[:tag] b.列出所有镜像 ...

  5. WPF中定时器Timer与DispatcherTimer的用法

    最近的工作项目中需要定时更新UI控件中的数据,这时候第一反应肯定会想到去使用System.Timers.Timer定时更新UI控件,但是程序运行后,会发现程序崩溃了.报的异常为“调用线程无法访问此对象 ...

  6. K8S集群 NOT READY的解决办法 1.13 错误信息:cni config uninitialized

    今天给同事 一个k8s 集群 出现not ready了 花了 40min 才搞定 这里记录一下 避免下载 再遇到了 不清楚. 错误现象:untime network not ready: Networ ...

  7. taro 与uni-app对比

    https://www.jianshu.com/p/03e08399587e   (copy)

  8. centOS7防火墙关闭失败问题

    CentOS7命令: 查看防火墙状态:firewall-cmd --state 关闭防火墙:systemctl stop firewalld.service 禁止开机自启:systemctl disa ...

  9. Bootstrap 面板(Panels)

    一.面板组件用于把 DOM 组件插入到一个盒子中.创建一个基本的面板,只需要向 <div> 元素添加 class .panel 和 class .panel-default 即可,如下面的 ...

  10. Json dump

    json 模块提供了一种很简单的方式来编码和解码JSON数据. 其中两个主要的函数是 json.dumps() 和 json.loads() , 要比其他序列化函数库如pickle的接口少得多. 下面 ...