通过CrawlSpider对招聘网站进行整站爬取(拉勾网实战)
爬虫首先要明确自己要爬取的网站以及内容
进入拉勾网的网站
然后看看想要爬取什么内容
职位,薪资,城市,经验要求
学历要求,全职或者兼职
职位诱惑,职位描述
提取公司的名称 以及 在拉勾网的url等等
然后在navicat中设计表
我是在数据库article_spider中设计的表lagou_job
- url varchar
- url_object_id varchar (作为主键)
- title varchar
- salary varchar (薪资) (不确定有没有工资,所以可以是空值)
- job_city varchar (可以为空)
- work_years varchar (可以为空)
- degree_need varchar (可以为空)
- job_type varchar (可以为空)
- publish_time varchar 可以想想怎么把varchar转换为datetime类型
- tags varchar varchar (可以为空)
- job_advantage varchar (可以为空)
- job_desc longtext
- job_addr varchar (可以为空) 具体工作地址
- company_url varchar (可以为空)
- company_name varchar (可以为空)
- crawl_time datetime
- crawl_update_time datetime (可以为空)
然后进入anaconda的命令行(这里采用别的也是一样)
scrapy genspider --list
可以看到有 crawl 模板
然后使用
scrapy genspider -t crawl lagou www.lagou.com
我们可以在目录下看到这个代码
- import scrapy
- class LagouSpider(CrawlSpider):
- name = 'lagou'
- allowed_domains = ['www.lagou.com']
- start_urls = ['http://www.lagou.com/']
- rules = (
- Rule(LinkExtractor(allow=("zhaopin/.*",)), follow=True),
- Rule(LinkExtractor(allow=("gongsi/\d+.html",)), follow=True),
- Rule(LinkExtractor(allow="jobs/\d+.html"), callback='parse_job', follow=True),
- )
其中rules 中的规则是读取拉勾网的二级目录下的筛选模式,我们只设置最后一种可以写入我们的数据库
接下来我们就可以分析网站中我们想要提取的对象了
我们可以先使用scrapy shell 进行分析
顺便提一句,现在拉勾网需要验证user-agent和cookies才能进行查看(而不是说要登录才能查看)
在anaconda的命令行中使用命令
- scrapy shell -s USER_AGENT="Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.86 Safari/537.36" https://www.lagou.com/jobs/4804175.html
进行分析
这里有一点,就是在shell中这样写
response.css(".position-label li::text").extract()
而在crawlspider中只需要写入(".position-label li::text"),后面不需要加入extract()
这样子就可以爬取到我们想要的数据...
把数据输入到mysql数据库中
在items中进行定义
- def remove_splash(value):
- #去掉工作城市的斜线
- return value.replace("/","")
- def handle_jobaddr(value):
- addr_list = value.split("\n")
- addr_list = [item.strip() for item in addr_list
- if item.strip()!="查看地图"]
- return "".join(addr_list)
- #self["front_image_path"], front_image_path,
- class LagouJobItemLoader(ItemLoader):
- #自定义itemloader
- default_output_processor = TakeFirst()
- class LagouJobItem(scrapy.Item):
- #拉勾网职位信息
- title = scrapy.Field()
- url = scrapy.Field()
- url_object_id = scrapy.Field()
- salary = scrapy.Field()
- job_city = scrapy.Field(
- input_processor = MapCompose(remove_splash)
- )
- work_years = scrapy.Field(
- input_processor = MapCompose(remove_splash)
- )
- degree_need = scrapy.Field(
- input_processor = MapCompose(remove_splash)
- )
- job_type = scrapy.Field()
- publish_time = scrapy.Field()
- job_advantage = scrapy.Field()
- job_desc = scrapy.Field()
- job_addr = scrapy.Field(
- input_processor=MapCompose(remove_tags,handle_jobaddr)
- )
- company_name = scrapy.Field()
- company_url = scrapy.Field()
- tags = scrapy.Field(
- input_processor = Join(",")
- )
- crawl_time = scrapy.Field()
- def get_insert_sql(self):
- insert_sql = """
- insert into lagou_job(title,url,url_object_id,
- salary,job_city,work_years,
- degree_need,job_type,publish_time,
- job_advantage,job_desc,job_addr,
- company_name,company_url,tags,
- crawl_time) VALUES( %s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)
- ON DUPLICATE KEY UPDATE salary=VALUES(salary),job_desc=VALUES(job_desc)
- """
- params = (
- self["title"],self["url"],self["url_object_id"],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_name"],
- self["company_url"],self["tags"],self["crawl_time"].strftime(SQL_DATETIME_FORMAT)
- )
- return insert_sql,params
lagou.py的文件如下
- import scrapy
- from datetime import datetime
- from scrapy.linkextractors import LinkExtractor
- from scrapy.spiders import CrawlSpider, Rule
- from ArticleSpider.items import LagouJobItem,LagouJobItemLoader
- from ArticleSpider.utils.common import get_md5
- class LagouSpider(CrawlSpider):
- name = 'lagou'
- allowed_domains = ['www.lagou.com']
- start_urls = ['http://www.lagou.com/']
- rules = (
- Rule(LinkExtractor(allow=("zhaopin/.*",)), follow=True),
- Rule(LinkExtractor(allow=("gongsi/\d+.html",)), follow=True),
- Rule(LinkExtractor(allow="jobs/\d+.html"), callback='parse_job', follow=True),#回调函数callback
- )
- def parse_job(self, response):
- #解析拉勾网的职位
- item_loader = LagouJobItemLoader(item=LagouJobItem(), response=response) #连接数据库的重要语句
- item_loader.add_css("title", ".job-name::attr(title)")
- item_loader.add_value("url", response.url)
- item_loader.add_value("url_object_id", get_md5(response.url))
- item_loader.add_css("salary", ".job_request .salary::text")
- 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("tags", '.position-label li::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("company_name", "#job_company dt a img::attr(alt)")
- item_loader.add_css("company_url", "#job_company dt a::attr(href)")
- item_loader.add_value("crawl_time", datetime.now())
- job_item = item_loader.load_item()
- return job_item
这里需要注意的是:以前拉勾网是不需要验证user-agent的,现在需要了,所以要加入
- custom_settings = {
- "COOKIES_ENABLED": False,
- "DOWNLOAD_DELAY": ,
- 'DEFAULT_REQUEST_HEADERS': {
- 'Accept': 'application/json, text/javascript, */*; q=0.01',
- 'Accept-Encoding': 'gzip, deflate, br',
- 'Accept-Language': 'zh-CN,zh;q=0.8',
- 'Connection': 'keep-alive',
- 'Cookie': 'user_trace_token=20171015132411-12af3b52-3a51-466f-bfae-a98fc96b4f90; LGUID=20171015132412-13eaf40f-b169-11e7-960b-525400f775ce; SEARCH_ID=070e82cdbbc04cc8b97710c2c0159ce1; ab_test_random_num=0; X_HTTP_TOKEN=d1cf855aacf760c3965ee017e0d3eb96; showExpriedIndex=1; showExpriedCompanyHome=1; showExpriedMyPublish=1; hasDeliver=0; PRE_UTM=; PRE_HOST=www.baidu.com; PRE_SITE=https%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3DsXIrWUxpNGLE2g_bKzlUCXPTRJMHxfCs6L20RqgCpUq%26wd%3D%26eqid%3Dee53adaf00026e940000000559e354cc; PRE_LAND=https%3A%2F%2Fwww.lagou.com%2F; index_location_city=%E5%85%A8%E5%9B%BD; TG-TRACK-CODE=index_hotjob; login=false; unick=""; _putrc=""; JSESSIONID=ABAAABAAAFCAAEG50060B788C4EED616EB9D1BF30380575; _gat=1; _ga=GA1.2.471681568.1508045060; LGSID=20171015203008-94e1afa5-b1a4-11e7-9788-525400f775ce; LGRID=20171015204552-c792b887-b1a6-11e7-9788-525400f775ce',
- 'Host': 'www.lagou.com',
- 'Origin': 'https://www.lagou.com',
- 'Referer': 'https://www.lagou.com/',
- 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36',
- }
- }
然后就可以看到数据写入到我们的表中了
这里可能会出现tags的值错误,因为tags中有可能是为空的
类似于这个网站
https://www.lagou.com/jobs/67631.html
这里就没有tags
我们可以定义一个函数处理这个错误。(这里就不说怎么做了)
通过CrawlSpider对招聘网站进行整站爬取(拉勾网实战)的更多相关文章
- 第6章 通过CrawlSpider对招聘网站进行整站爬取
通过前几章的2个项目的学习,其实本章的拉钩网项目还是挺容易理解的. 本章主要的还是对CrawlSpider源码的解析,其实我对源码还不是很懂,只是会基本的一些功能而已. 不分小节记录了,直接上知识点, ...
- Scrapy 使用CrawlSpider整站抓取文章内容实现
刚接触Scrapy框架,不是很熟悉,之前用webdriver+selenium实现过头条的抓取,但是感觉对于整站抓取,之前的这种用无GUI的浏览器方式,效率不够高,所以尝试用CrawlSpider来实 ...
- 网站seo整站优化有什么优势
http://www.wocaoseo.com/thread-314-1-1.html 现在很多企业找网络公司做网站优化,已经不再像以前那样做目标关键词,而是通过整站优化来达到企业营销目的 ...
- wget整站抓取、网站抓取功能;下载整个网站;下载网站到本地
wget -r -p -np -k -E http://www.xxx.com 抓取整站 wget -l 1 -p -np -k http://www.xxx.com 抓取第一级 - ...
- 爬取拉勾网招聘信息并使用xlwt存入Excel
xlwt 1.3.0 xlwt 文档 xlrd 1.1.0 python操作excel之xlrd 1.Python模块介绍 - xlwt ,什么是xlwt? Python语言中,写入Excel文件的扩 ...
- 写了一个Windows服务,通过C#模拟网站用户登录并爬取BUG列表查询有没有新的BUG,并提醒我
写了一个Windows服务,通过C#模拟网站用户登录并爬取BUG列表查询有没有新的BUG,并提醒我 1.HttpUtil工具类,用于模拟用户登录以及爬取网页: using System; using ...
- python爬虫10 b站爬取使用 selenium+ phantomJS
但有时候 我们不想要让它打开浏览器去执行 能不能直接在代码里面运行呢 也就是说 有没有一个无形的浏览器呢 恩 phantomJS 就是 它是一个基于 WebKit 的浏览器引擎 可以做到无声无息的操作 ...
- 8月份Python招聘情况怎么样?Python爬取招聘数据,并进行分析
前言 拉勾招聘是专业的互联网求职招聘平台.致力于提供真实可靠的互联网招聘求职找工作信息.今天我们一起使用 python 采集拉钩的 python 招聘信息,分析一下找到高薪工作需要掌握哪些技术 开发环 ...
- 歌曲网站,教你爬取 mp3 和 lyric
从歌曲网站,获取音频和歌词的流程: 1, 输入歌曲名,查找网站中存在的歌曲 id 2, 拿歌曲 id 下载歌词 lyric 简单的 url 拼接 3, 拿歌曲 id 下载音频 mp3 先用一个 POS ...
随机推荐
- Linux - 找到正在使用的 Shell 是哪个
1. ps -p $$ 一个名为 "$$" (这是shell的特殊参数),表示当前你正在运行的 shell 实例的 PID 2. echo $0 3. echo $SHELL - ...
- spring web 测试用例
spring web 测试有三种方式 1. 自己初始化 MockMvc 2.依赖@springbootTest 它会帮你生产 webTestClient ,只需自己注入即可. 3.启动的时候,不加载整 ...
- float,double,int的区别
int num = 10/4; float num2 = 10/4; double num3 = 10.0/4.0; System.out.println(num); System.out.print ...
- Services: ARP Caching
Online Help for Cisco IOS Release 12.2(15)JA Services: ARP Caching ARP caching on the access point ...
- 前缀和-Big Water Problem (牛客)
链接:https://ac.nowcoder.com/acm/problem/15164 题目描述 给一个数列,会有多次询问,对于每一次询问,会有两种操作: 1:给定两个整数x, y, 然后在原数组的 ...
- 一个高级PHP工程师所应该具备的(转自元如枫博客)
初次接触PHP,就为他的美所折服,于是一发不可收拾. 很多面试,很多人员能力要求都有“PHP高级工程师的字眼”,如果您真心喜欢PHP,并且您刚起步,那么我简单说说一个PHP高级工程师所应该具备的,希望 ...
- nyoj 40
题目:http://acm.nyist.edu.cn/JudgeOnline/status.php?pid=40 求最大公约数和最小公倍数... 思路:欧几里德算法求出最大公约数,即最大公约数 = g ...
- 【Javaweb】Servlet的xml和注解配置
1.xml <%@ page language="java" contentType="text/html;" %> <!DOCTYPE ht ...
- js中字符串转json对象时报错: Uncaught SyntaxError: Unexpected token s in JSON at position 2
解决方法: js中获取jsp的返回值 var json='${channels}' var channels = JSON.parse(json);就报上面的错. json的值最终会转成这种json格 ...
- kubernetes从入门到放弃(二)
kubernetes对象之pod 1.pod的认识 Pod直译是豆荚,可以把容器想像成豆荚里的豆子,把一个或多个关系紧密的豆子包在一起就是豆荚(一个Pod).在Kubernetes中我们不会直接操作容 ...