人生苦短,快学Python!

初学scrapy之后,发现就是效率对比于selenium和requests快了很多,那么问题来了,如果网站设置了反爬,比如User-Agent反爬,cookie反爬,IP封禁等等,所以我们需要通过集成selenium到scrapy中,绕过网站反爬,达到目的。

这里选择智联招聘网站作为案例,就是虽然不是动态网页,但是它需要模拟登录,所以我们通过scrapy集成selenium进行数据抓取。

一、需求分析

打开目标网站,搜索web前端开发工程师

这是首页,由于我的当前位置在武汉,所以系统自动定位到武汉,点击搜索后:

这个就是需要通过selenium出路的一个点。

手动登录后得到以下界面:

我们的目标是每一条招聘信息的8条数据:

  1. name 职位名称

  2. salary 薪资

  3. adress  地区

  4. experience 经验

  5. eduBack  教育背景

  6. company 公司名称

  7. companyType 公司类型

  8. scale 公司规模

  9. 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)

说明:

  1. selenium集成到scrapy中的核心就是在爬虫中间件中拦截请求,把处理后的响应对象返回,对应于爬虫文件(这里的zl.py)parse函数中的response,如果不集成selenium,那么response对象不能很好应对网站的反爬.

  2. 此处的parse_request方法中只有少量的selenium代码,因为动态操作其实不多.

  3. 重点: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爬取智联招聘数据相关推荐

  1. python+selenium爬取智联招聘信息

    python+selenium爬取智联招聘信息 需求 准备 代码 结果 需求 老板给了我一份公司名单(大概几百家如下图),让我到网上看看这些公司分别在招聘哪些岗位,通过分析他们的招聘需求大致能推断出我 ...

  2. BeautifulSoup爬取智联招聘数据

    BeautifulSoup爬取智联招聘数据 警告: 此项技术仅适用于练习,限制大量大规模爬取,在爬取中使用了个人cookie,请注意不要随意泄露,内含个人隐私信息! 如果过分爬取,会造成ip被封! 1 ...

  3. 深圳python数据分析师招聘_Python爬取智联招聘数据分析师岗位相关信息的方法

    Python爬取智联招聘数据分析师岗位相关信息的方法 发布时间:2020-09-23 23:23:12 来源:脚本之家 阅读:88 进入智联招聘官网,在搜索界面输入'数据分析师',界面跳转,按F12查 ...

  4. 使用selenium爬取智联招聘

    我是一名在校大学生,这是第一次写博客,希望记录一下自己的学习过程,然后如果哪里做的不好打扰或者影响到您,可以联系我修改.删除. 哇,--弄了好久才明白咋回事.我想开头空两格写,然后发现空两格之后他就不 ...

  5. 给大家整理了一篇Python+selenium爬取智联招聘的职位信息

    整个爬虫是基于selenium和Python来运行的,运行需要的包 1 mysql,matplotlib,selenium 需要安装selenium火狐浏览器驱动,百度的搜寻. 整个爬虫是模块化组织的 ...

  6. 招聘网python职位_Python+selenium爬取智联招聘的职位信息

    整个爬虫是基于selenium和Python来运行的,运行需要的包 1 mysql,matplotlib,selenium 需要安装selenium火狐浏览器驱动,百度的搜寻. 整个爬虫是模块化组织的 ...

  7. scrapy使用之爬取智联招聘

    智联招聘是通过动态加载文件获取数据,所以一开始解析的url不是网页的地址,而是json 文件,寻找json文件的方法.通过查看各个工作具体的网址得知规律:https://job.zhaopin.com ...

  8. python爬虫实例之爬取智联招聘数据

    这是作者的处女作,轻点喷.... 实习在公司时领导要求学习python,python的爬虫作为入门来说是十分友好的,话不多说,开始进入正题. 主要是爬去智联的岗位信息进行对比分析出java和pytho ...

  9. Scrapy学习——爬取智联招聘网站案例

    Scrapy学习--爬取智联招聘网站案例 安装scrapy 下载 安装 准备 分析 代码 结果 安装scrapy 如果直接使用pip安装会在安装Twisted报错,所以我们需要手动安装. 下载 安装s ...

最新文章

  1. 清华大学人工智能深度报告:八大维度解析机器学习
  2. Blockchain区块链架构设计之四:Fabric多通道和下一代账本设计
  3. 测验4: 程序的控制结构 (第4周)
  4. 从小白到大神程序员必读15本经典电子书免费送第三季(先到先得)
  5. 【整理】强化学习与MDP
  6. springboot 打印slf4_SpringBoot 整合 slf4j 日志打印
  7. Spring - Netty (整合)
  8. rust大油田分解机_辽河油田曙光采油厂:智慧党建建强战斗堡垒
  9. 微信开发者工具命令行_微信开发者工具 Linux版
  10. 电商直播运营的思路流程
  11. 【计算机组成原理】中央处理器(三)—— 数据通路
  12. 阿里矢量图库 当前页全选
  13. Tekla structures Xsteel BIM视频教程105G钢结构19.0 、21.0教程
  14. Liskov Substitution Principle
  15. Python数据分析案例-消费者用户画像
  16. 【渝粤教育】电大中专中药调剂作业 题库
  17. U3D Shader
  18. 使用DreamweaverMX2004的搜索替换功能提高工作效率。
  19. 增强现实(AR)的前世今生...
  20. jquery的学习个人总结

热门文章

  1. 航嘉服务器维修电源,无故障60000小时,服务器/工控机电源推荐
  2. linux系统php连接dm达梦
  3. Meta:不用插管!AI看看脑电图就知道你在想啥
  4. 厚脸皮,是一个人最了不起的才华
  5. 【PS4开发】unity3d ps4手柄键位
  6. Windows 性能超越 Linux?
  7. jqGrid学习笔记
  8. 原生JS实现轮播图 方法总结
  9. element更改导航菜单被选中项的背景颜色
  10. Flutter:从入门到实践