专栏首页快学Python实战案例 | Scrapy 集成Selenium爬取智联招聘数据

实战案例 | Scrapy 集成Selenium爬取智联招聘数据

人生苦短,快学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 scrapy

class 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 ZlzpItem

count = 1   # 定义一个全局变量,与base_url构建 下一页的url 
class ZlSpider(scrapy.Spider):
    name = 'zl'
    allowed_domains = ['zhaopin.com']
    start_urls = [firstPageUrl]

2、parse函数:

    def parse(self, response):

        global count
        count += 1  # 每解析一次页面,让count+1,和baseurl构造下一页的url

        jobList = 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 csv

class 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对象返回给爬虫。

本文分享自微信公众号 - 快学Python(kxpython),作者:快快

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-07-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 爬虫必备,案例对比 Requests、Selenium、Scrapy 爬虫库!

    经常有读者会爬虫学哪个库?其实常用的 Python 爬虫库无非是requests,selenium和scrapy,且每个库都有他们的特点,对于我来说没有最推荐的...

    小F
  • 知己知彼,案例对比 Requests、Selenium、Scrapy 爬虫库!

    经常有读者会问爬虫学哪个库?其实常用的 Python 爬虫库无非是requests,selenium和scrapy,且每个库都有他们的特点,对于我来说没有最推荐...

    CDA数据分析师
  • 案例对比 Requests、Selenium、Scrapy 谁是yyds?

    经常有读者会爬虫学哪个库?其实常用的 Python 爬虫库无非是requests,selenium和scrapy,且每个库都有他们的特点,对于我来说没有最推荐的...

    龙哥
  • 爬虫0601:scrapy实战scrapy实战:智联招聘数据采集

    采集的数据要被封装起来进行使用,找到并修改zhilianspider/zhilianspider/items.py,修改内容如下:

    大牧莫邪
  • 爬虫课程(一)|课程介绍和安排

    黄小怪
  • 如何在一个月内学会Python爬取大规模数据

    慕白
  • 关于Python爬虫,这里有一条高效的学习路径

    关键字全网搜索最新排名 【机器学习算法】:排名第一 【机器学习】:排名第一 【Python】:排名第三 【算法】:排名第四 ? 如果你仔细观察,就不难发现,懂爬...

    昱良
  • 爬虫爬取智联招聘的职位信息(基础)

    简单爬取智联招聘的内容,爬之前在网上找关于这方面的代码,最后发现都不行,智联现在的招聘信息都是js加载,直接请求响应不到响应的内容,只能使用selenium,通...

    andrew_a
  • 关于Python爬虫,这里有一条高效的学习路径

    如果你仔细观察,就不难发现,懂爬虫、学习爬虫的人越来越多,一方面,互联网可以获取的数据越来越多,另一方面,像 Python这样的编程语言提供越来越多的优秀工具,...

    Python进阶者
  • 不踩坑的Python爬虫:如何在一个月内学会爬取大规模数据

    Python爬虫为什么受欢迎 如果你仔细观察,就不难发现,懂爬虫、学习爬虫的人越来越多,一方面,互联网可以获取的数据越来越多,另一方面,像 Python这样的...

    Python中文社区
  • 不踩坑的Python爬虫:如何在一个月内学会爬取大规模数据

    Python爬虫为什么受欢迎 如果你仔细观察,就不难发现,懂爬虫、学习爬虫的人越来越多,一方面,互联网可以获取的数据越来越多,另一方面,像 Python这样的...

    机器学习AI算法工程
  • 不踩坑的Python爬虫:如何在一个月内学会爬取大规模数据

    Python爬虫为什么受欢迎 如果你仔细观察,就不难发现,懂爬虫、学习爬虫的人越来越多,一方面,互联网可以获取的数据越来越多,另一方面,像 Python这样的编...

    昱良
  • scrapy0700:深度爬虫scrapy深度爬虫

    爬虫程序,主要是用与数据采集处理的一种网络程序,在操作过程中针对指定的url地址进行数据请求并根据需要采集数据,但是在实际项目开发过程中,经常会遇到目标url地...

    大牧莫邪
  • Python网络爬虫工程师需要掌握的核心技术

    为了让具备Python基础的人群适合岗位的需求,小编推出了一门全面的、系统的、简易的Python网络爬虫入门级课程,不仅讲解了学习网络爬虫必备的基础知识,而且加...

    python学习教程
  • 学透着13个爬虫,这天下将没有你爬不到的

    这把火已经烧到了程序员的圈子外,从小学生到职场老司机,都开始学习这一门新的语言,门槛低、零基础、操作骚...再也没有什么能阻挡Python晋升网红。

    py3study
  • Python大牛廖雪峰13个案例带你全面掌握商业爬虫!

    这把火已经烧到了程序员的圈子外,从小学生到职场老司机,都开始学习这一门新的语言,门槛低、零基础、操作骚...再也没有什么能阻挡Python晋升网红。

    sergiojune
  • 抓取58job, 赶集job以及智联招聘,并使用数据分析生成echarts图

    **抓取58job, 赶集job以及智联招聘,并使用数据分析生成echarts图**

    andrew_a
  • Python数据科学(五)- 数据处理和数据采集1.处理不同格式的数据2.网络爬虫3.小试牛刀

    最近因为工作的事比较忙,要学的东西也很多,没有及时更新,下一阶段我会尽力一天一更的,一块学习的朋友跟紧不走丢ヽ(ˋ▽ˊ)ノ

    Python攻城狮
  • Python爬虫 | 一条高效的学习路径

    数据是创造和决策的原材料,高质量的数据都价值不菲。而利用爬虫,我们可以获取大量的价值数据,经分析可以发挥巨大的价值,比如:

    conanma

扫码关注云+社区

领取腾讯云代金券