实战案例 | Scrapy 集成Selenium爬取智联招聘数据
人生苦短,快学Python!
初学scrapy
之后,发现就是效率对比于selenium和requests快了很多,那么问题来了,如果网站设置了反爬,比如User-Agent反爬,cookie反爬,IP封禁等等,所以我们需要通过集成selenium到scrapy中,绕过网站反爬,达到目的。
这里选择智联招聘
网站作为案例,就是虽然不是动态网页,但是它需要模拟登录,所以我们通过scrapy集成selenium进行数据抓取。
一、需求分析
打开目标网站,搜索web前端开发工程师。
这是首页,由于我的当前位置在武汉,所以系统自动定位到武汉,点击搜索后:
这个就是需要通过selenium出路的一个点。
手动登录后得到以下界面:
我们的目标是每一条招聘信息的8条数据:
name 职位名称
salary 薪资
adress 地区
experience 经验
eduBack 教育背景
company 公司名称
companyType 公司类型
scale 公司规模
info 简介
二、scrapy项目文件配置
定义items
import scrapyclass ZlzpItem(scrapy.Item):name = scrapy.Field()***薪资 公司 规模...***info = scrapy.Field()
定义scrapy爬虫:zl.py(智联)
#这里先说明下url:
firstPageUrl : 'https://sou.zhaopin.com/?jl=736&kw=web%E5%89%8D%E7%AB%AF%E5%B7%A5%E7%A8%8B%E5%B8%88&p=1'#作为第一页的url,下面的myspider.py中就不在展示,避免代码冗余。base_url = 'https://sou.zhaopin.com/?jl=736&kw=web%E5%89%8D%E7%AB%AF%E5%B7%A5%E7%A8%8B%E5%B8%88&p={}'
然后下面是zl.py的源码:(分为几个部分)
1、初始化设置:
# -*- coding: utf-8 -*-
import scrapy
from zlzp.items import ZlzpItemcount = 1 # 定义一个全局变量,与base_url构建 下一页的url
class ZlSpider(scrapy.Spider):name = 'zl'allowed_domains = ['zhaopin.com']start_urls = [firstPageUrl]
2、parse函数:
def parse(self, response):global countcount += 1 # 每解析一次页面,让count+1,和baseurl构造下一页的urljobList = response.xpath('//div[@class="positionlist"]/div/a')for job in jobList:name = job.xpath("./div[1]/div[1]/span[1]/text()").extract_first() ...salary***,company***,....info = job.xpath("./div[3]/div[1]//text()").extract_first()item = ZlzpItem(name=name,salary=salary,company=company,adress=adress,experience=experience,eduBack=eduBack,companyType=companyType,scale=scale,info=info)yield item
3、分页:
next_url = 'https://sou.zhaopin.com/?jl=736&kw=web%E5%89%8D%E7%AB%AF%E5%B7%A5%E7%A8%8B%E5%B8%88&p={}'.format(count)if count == 34:return None # 设置程序停止的条件if next_url:yield scrapy.Request(next_url,callback=self.parse)
定义下载器中间件(DownloadMiddleware):myDownloadMiddleware.py
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
...
class ZlzpDownloaderMiddleware:def __init__(self):self.driver = webdriver.Chrome()def process_request(self, request, spider):self.driver.get(request.url)time.sleep(3) # 休息3s# 设置显示等待,由于需要登录,我们手机扫码登录,知道页面出现(即url显示为firstpageurl)WebDriverWait(self.driver, 1000).until(EC.url_contains(request.url))time.sleep(6) # 登录成功之后页面需要时间加载出来,再休息几秒return HtmlResponse(url=self.driver.current_url, body=self.driver.page_source, encoding="utf-8",request=request) # 然后把这个response对象返回给爬虫(zl.py)
说明:
selenium集成到scrapy中的核心就是在爬虫中间件中拦截请求,把处理后的响应对象返回,对应于爬虫文件(这里的zl.py)parse函数中的response,如果不集成selenium,那么response对象不能很好应对网站的反爬.
此处的parse_request方法中只有少量的selenium代码,因为动态操作其实不多.
重点:return后面的response对象:
在这里我们不能return None,如果return None,那么请求会被发送到下载中间件去下载这个页面,在将这个页面的response返回给spider(hr.py)。但是我们上面browser.get的时候就已经下载了这个页面的内容,所以没有必要在下载一次,我们只要制定一个response对象,直接返回这个response给spider即可
定义管道(Pipeline):pipelines.py
from itemadapter import ItemAdapter
import csvclass ZlzpPipeline:def __init__(self):self.f = open('zlJob.csv', 'w', encoding='utf-8', newline='')# self.file_name = ['name','upTime','salary','needs','welfare','company','scale','types']self.file_name = ['name','salary','company','adress','experience','eduBack','companyType','scale','info'] self.writer = csv.DictWriter(self.f, fieldnames=self.file_name)self.writer.writeheader()def process_item(self, item, spider):self.writer.writerow(dict(item))# 写入spider传过来的具体数值return item # 写入完返回def close_spider(self, spider):self.f.close()
settings.py配置
BOT_NAME = 'zlzp'SPIDER_MODULES = ['zlzp.spiders']
NEWSPIDER_MODULE = 'zlzp.spiders'
LOG_LEVEL = 'WARNING'
......
ROBOTSTXT_OBEY = False......
DEFAULT_REQUEST_HEADERS = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.106 Safari/537.36','Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8','Accept-Language': 'en',
}
......
DOWNLOADER_MIDDLEWARES = {'zlzp.middlewares.ZlzpDownloaderMiddleware': 543,
}
......
ITEM_PIPELINES = {'zlzp.pipelines.ZlzpPipeline': 300,
}
......
......表示注释代码,这里省略。
三、程序运行
命令行键入:
scrapy crawl hr
pic1:运行程序结束到第34页,对应count = 34
pic02:(csv文件)
四、数据简单分析
查看数据
import pandas as pd
df = pd.read_csv('./zlJob.csv')
df.head()
薪资饼图展示
c = (Pie(init_opts=opts.InitOpts(bg_color="white")).add("", [list(z) for z in zip(typesX,number)]) # zip函数两个部分组合在一起list(zip(x,y))-----> [(x,y)].set_global_opts(title_opts=opts.TitleOpts(title="类型:")) # 标题.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}")) # 数据标签设置
)c.render_notebook()
经验要求柱图展示
from pyecharts.charts import Bar
bar = Bar()
bar.add_xaxis(['3-5年', '1-3年', '不限', '5-10年', '无经验', '1年以下', '10年以上'])
bar.add_yaxis('经验要求',[462,329,83,78,19,15,4])
bar.render()
学历要求柱图展示
c = (Pie(init_opts=opts.InitOpts(bg_color="white")).add("", [list(z) for z in zip(educationTypes,number)]) # zip函数两个部分组合在一起list(zip(x,y))-----> [(x,y)].set_global_opts(title_opts=opts.TitleOpts(title="类型:")) # 标题.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}")) # 数据标签设置
)c.render_notebook()
大多数要求本科学历,或者说大专及以上学历。
公司类型柱图展示
c = (Pie(init_opts=opts.InitOpts(bg_color="white")).add("", [list(z) for z in zip(companyTypes,number)]) # zip函数两个部分组合在一起list(zip(x,y))-----> [(x,y)].set_global_opts(title_opts=opts.TitleOpts(title="类型:")) # 标题.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}")) # 数据标签设置
)c.render_notebook()
可以看到大多数公司是民营或者上市公司。
五、总结
页面翻页处理,由于我们只是使用selenium就是打开网页请求数据,所以一般在爬虫文件中进行翻页处理,如果对应的下一页的a标签的href属性不是下一页的页面url,我们需要设置动态全局变量,构建动态的url。
下载中间件中设置的selenium的相关操作,动态点击,页面滚轮操作,显隐式等待等等,重要的是返回的response对象,这个是集成selenimu到scrapy的核心,在下载中间件中拦截请求,把处理后的response对象返回给爬虫。
分享给更多朋友,转发,点赞,在看
实战案例 | Scrapy 集成Selenium爬取智联招聘数据相关推荐
- python+selenium爬取智联招聘信息
python+selenium爬取智联招聘信息 需求 准备 代码 结果 需求 老板给了我一份公司名单(大概几百家如下图),让我到网上看看这些公司分别在招聘哪些岗位,通过分析他们的招聘需求大致能推断出我 ...
- BeautifulSoup爬取智联招聘数据
BeautifulSoup爬取智联招聘数据 警告: 此项技术仅适用于练习,限制大量大规模爬取,在爬取中使用了个人cookie,请注意不要随意泄露,内含个人隐私信息! 如果过分爬取,会造成ip被封! 1 ...
- 深圳python数据分析师招聘_Python爬取智联招聘数据分析师岗位相关信息的方法
Python爬取智联招聘数据分析师岗位相关信息的方法 发布时间:2020-09-23 23:23:12 来源:脚本之家 阅读:88 进入智联招聘官网,在搜索界面输入'数据分析师',界面跳转,按F12查 ...
- 使用selenium爬取智联招聘
我是一名在校大学生,这是第一次写博客,希望记录一下自己的学习过程,然后如果哪里做的不好打扰或者影响到您,可以联系我修改.删除. 哇,--弄了好久才明白咋回事.我想开头空两格写,然后发现空两格之后他就不 ...
- 给大家整理了一篇Python+selenium爬取智联招聘的职位信息
整个爬虫是基于selenium和Python来运行的,运行需要的包 1 mysql,matplotlib,selenium 需要安装selenium火狐浏览器驱动,百度的搜寻. 整个爬虫是模块化组织的 ...
- 招聘网python职位_Python+selenium爬取智联招聘的职位信息
整个爬虫是基于selenium和Python来运行的,运行需要的包 1 mysql,matplotlib,selenium 需要安装selenium火狐浏览器驱动,百度的搜寻. 整个爬虫是模块化组织的 ...
- scrapy使用之爬取智联招聘
智联招聘是通过动态加载文件获取数据,所以一开始解析的url不是网页的地址,而是json 文件,寻找json文件的方法.通过查看各个工作具体的网址得知规律:https://job.zhaopin.com ...
- python爬虫实例之爬取智联招聘数据
这是作者的处女作,轻点喷.... 实习在公司时领导要求学习python,python的爬虫作为入门来说是十分友好的,话不多说,开始进入正题. 主要是爬去智联的岗位信息进行对比分析出java和pytho ...
- Scrapy学习——爬取智联招聘网站案例
Scrapy学习--爬取智联招聘网站案例 安装scrapy 下载 安装 准备 分析 代码 结果 安装scrapy 如果直接使用pip安装会在安装Twisted报错,所以我们需要手动安装. 下载 安装s ...
最新文章
- 清华大学人工智能深度报告:八大维度解析机器学习
- Blockchain区块链架构设计之四:Fabric多通道和下一代账本设计
- 测验4: 程序的控制结构 (第4周)
- 从小白到大神程序员必读15本经典电子书免费送第三季(先到先得)
- 【整理】强化学习与MDP
- springboot 打印slf4_SpringBoot 整合 slf4j 日志打印
- Spring - Netty (整合)
- rust大油田分解机_辽河油田曙光采油厂:智慧党建建强战斗堡垒
- 微信开发者工具命令行_微信开发者工具 Linux版
- 电商直播运营的思路流程
- 【计算机组成原理】中央处理器(三)—— 数据通路
- 阿里矢量图库 当前页全选
- Tekla structures Xsteel BIM视频教程105G钢结构19.0 、21.0教程
- Liskov Substitution Principle
- Python数据分析案例-消费者用户画像
- 【渝粤教育】电大中专中药调剂作业 题库
- U3D Shader
- 使用DreamweaverMX2004的搜索替换功能提高工作效率。
- 增强现实(AR)的前世今生...
- jquery的学习个人总结