拉钩网招聘
趁着学习计划空白的时间,我决定自己创建一个project练手爬虫,刚好可以实践之前学习过的scrapy
1.抓取拉钩网下,关键字为【数据分析】【上海】的所有招聘信息
2.将抓取的信息保存到本地数据库
3.对抓取到的信息进行数据清洗
4.对数据进行分析,包括筛选出符合需求的信息,并给出具体的可视化结果与分析结论
使用工具:仅限使用scrapy
项目拟定好后,首先进入My_Test工作目录,创建爬虫项目
scrapy startproject newlagou
然后进入建立好的项目目录中,建立自己的爬虫。新建的文件在spider目录下,实际上这个爬虫文件也可以手动建立
scrapy genpider zhaopingye lagou.com
随后,通过上网参考其他大神的代码,完善自己的爬虫项目。
首先,在items中创建自己想要爬取的数据内容,这个地方暂时只创建了一项,我想要获取搜索“商业数据分析”后弹出的清单中所有的超链接(为之后爬取每一个页面做铺垫)
class NewlagouItem(scrapy.Item):
job_web = scrapy.field()
pass
pipelines暂时不设置。(事实上,在学习的过程中设置过了pipeline,这个文件可以帮助你更好的保存爬取出的数据)
settings的设置比较重要,这个地方要设置好防爬取的一些内容,包括headers和爬取速率、反重定向等。这个地方的坑比较多,还需要慢慢填。目前设置了爬取间隔为15s,之前设置的3s,爬取5个页面后就会被迫重定向到登录页。考虑过使用selenium模拟浏览器,暂时还不能很好的解决该问题。
BOT_NAME = 'newlagou'
SPIDER_MODULES = ['newlagou.spiders']
NEWSPIDER_MODULE = 'newlagou.spiders'
# Crawl responsibly by identifying yourself (and your website) on the user-agent
# USER_AGENT = 'lagouSpider (+http://www.yourdomain.com)'
# Obey robots.txt rules,
# Scrapy 默认是遵守爬虫准则的,即ROBOTSTXT_OBEY = True,如果遵守爬虫准则的,是不能用Scrapy来爬取的,这时需要把ROBOSTSXT_OBEY=False,也就是不遵守它的规则,一般我们都是不遵守他的规则。
ROBOTSTXT_OBEY = False
# 报那些状态错误,就把错误加上,允许这种错误,上面报的是403,就把403加入。
HTTPERROR_ALLOWED_CODES = [403, 302]
# 禁止被重定向
REDIRECT_ENABLED = False
DEFAULT_request_HEADERS = {
'Accept': 'text/html,APPlication/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'Accept-Encoding': 'gzip, deflate, sdch, br',
'Accept-Language': 'zh-CN,zh;q=0.8',
'cache-Control': 'max-age=0',
'Connection': 'keep-alive',
# 'referer': 'https://www.lagou.com/',
'Host': 'www.lagou.com',
'User-Agent': 'Mozilla/5.0 (windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.104 Safari/537.36 Core/1.53.4482.400 QQBrowser/9.7.13001.400'
}
# configure maximum concurrent requests performed by Scrapy (default: 16)
# CONCURRENT_REQUESTS = 32
# Configure a delay for requests for the same website (default: 0)
# See https://doc.scrapy.org/en/latest/topics/settings.html#download-delay
# See also autothrottle settings and docs
# 设置延迟3秒,操作太快容易遭遇反爬虫
DOWNLOAD_DELAY = 15
# The download delay setting will honor only one of:
# CONCURRENT_REQUESTS_PER_DOMAIN = 16
# CONCURRENT_REQUESTS_PER_IP = 16
最后,我们设置主程序。name是唯一的,启动爬虫时它将会帮助我们识别启动的是哪一个程序。start_urls则形成了一个列表,爬虫会自动爬取这个列表里所有的网页内容。
parse函数是自定义的内容提取函数。首先定义item为自定义的爬取对象,ps为整个清单,当然了,其中含有很多个子p,下面的for循环就是要来遍历它。在循环中,使用xpath().extract()获取目标内容,即单个招聘信息对应的招聘页。
随后,使用一段代码进行格式重整,防止爬取到空数据,最后去除获取的数据两旁的空格,并将其传入item(item必须是一个字典或其他,不能是str)
最后使用一个yield回传数据。这个是比return厉害的,能够在传入数据后立即结束进程,防止内存占用。
import scrapy
from newlagou.items import NewlagouItem
class LagouSpider(scrapy.Spider):
name = 'zhaopingye'
allowed_domains = ['lagou.com']
start_urls = [
'https://www.lagou.com/zhaopin/shangyeshjufenxi/{}/?filterOption=3'.format(i) for i in range(1,31)
] # 这里是我们开始爬取的网站
def parse(self, response):
item = NewlagouItem()
ps = response.xpath('//*[@id="s_position_list"]/ul/li/p[1]')
for p in ps:
# 可以获得对应招聘页的超链接
job_web = p.xpath('./p[1]/p[1]/a/@href').extract()
job_web = job_web[0] if len(job_web) > 0 else '无数据'
item['job_web'] = job_web.strip()
yield item
至此,所有的程序编写完成,返回cmd命令行,输入
scrapy crawl zhaopingye -o data.json
开始运行自己的爬虫程序
如果顺利的话,我们就可以将所有目标数据爬取至本地目录下的json文件中。
我在这里遇到两个问题,首先是爬取到第17个页面时就开始返回302错误,这是被重定向至登录页的缘故,我把爬取间隔改到了15s还是不能规避这个问题,好蛋疼!于是我只好手动修改了爬取目标网页的范围,分两次爬取目标。
其次我发现,保存好的json程序不能load读取,几经周折后我发现,json数据库里竟然有缺失 = = 在某些地方缺失了,与[,我手动增加后终于可以load成list了
最后获取到的数据示例如下
[
{"job_web": "https://www.lagou.com/jobs/5527073.html"},
{"job_web": "https://www.lagou.com/jobs/5826763.html"},
{"job_web": "https://www.lagou.com/jobs/5545028.html"},
{"job_web": "https://www.lagou.com/jobs/5566843.html"},
{"job_web": "https://www.lagou.com/jobs/4876647.html"}
]
emm,今天各种撞墙,最终只完成了一样一点微小的工作,明天开始正式爬取招聘页的各项数据!~
相关阅读
网页中使用的特殊字体(webdings, wingdings 2)
前言对字体的相关介绍可以参考 网页中使用的字体介绍 经常在某些网页中看到一些特殊的效果:比如一个红色的圆圈, 一个
http://jingyan.baidu.com/article/cdddd41c46531953cb00e1c7.html 工具/原料 电脑 第一步、清除DNS解析缓存 1我们的系统会
2016年3月28日,A5站长网正式更名为A5创业网,完成一个质的飞跃,面向互联网创业者打造出更为精准、更具权威性的创业资讯和服务平台。
试问:怎样在拍拍团购这场大战中打一场胜仗?想必很多拍友们都会不知所云,那么针对此类活动的以往经验以及所带来的效果,精灵整理了一
一张悄无声息的情况说明,宣告一个老牌奢侈品电商独角兽轰然倒下。8月7日,通过一则独家爆料信息,《每日经济新闻》的记者了解到尚品可