Python实战:使用DrissionPage库爬取拉勾网职位信息

DrissionPage库,号称可以把Selenium按在地上摩擦!

常规情况下,我们借助 requests 库爬取不加密的网站,使用 Selenium 库爬取加密的网站。

requests 效率高,但是解密难度大。Selenium 库可以实现网页自动化,不用解密,但是爬虫效率不高。

那有没有什么库既效率高,又可以网页自动化。

DrissionPage 库他来了,号称可以把 Selenium 按在地上摩擦!

DrissionPage 库结合了 requests 和 selenium 的特长,既实现了和 Selenium 库类似的网页自动化效果,又提升了爬虫效率。同时实现代码“写得快”和“跑得快”。

DrissionPage 库在码云上有 3.4k 个 Star,很牛了。

今天我们就使用 DrissionPage 库实战,爬取拉勾网职位信息。

一、简介

DrissionPage 是一个基于 python 的网页自动化工具。它既能控制浏览器,也能收发数据包,还能把两者合而为一。可兼顾浏览器自动化的便利性和 requests 的高效率。它功能强大,内置无数人性化设计和便捷功能。它的语法简洁而优雅,代码量少,对新手友好。

用 requests 做数据采集面对要登录的网站时,要分析数据包、JS 源码,构造复杂的请求,往往还要应付验证码、JS 混淆、签名参数等反爬手段,门槛较高,开发效率不高。使用浏览器,可以很大程度上绕过这些坑,但浏览器运行效率不高。

因此,这个库设计初衷,是将它们合而为一,同时实现“写得快”和“跑得快”。能够在不同需要时切换相应模式,并提供一种人性化的使用方法,提高开发和运行效率。除了合并两者,本库还以网页为单位封装了常用功能,提供非常简便的操作和语句,使用户可减少考虑细节,专注功能实现。以简单的方式实现强大的功能,使代码更优雅。

以前的版本是对 selenium 进行重新封装实现的。从 3.0 开始,作者另起炉灶,对底层进行了重新开发,摆脱对 selenium 的依赖,增强了功能,提升了运行效率。

二、入门案例

1、启动浏览器

默认状态下,程序会自动在系统内查找 Chrome 路径。

执行以下代码,浏览器启动并且访问百度网页。

from DrissionPage import ChromiumPage

page = ChromiumPage()
page.get('https://www.baidu.com/')

浏览器顺利打开了百度的网页。

2、爬取码云网站项目

网址:https://gitee.com/explore/all

这个示例的目标,要获取所有库的名称和链接,为避免对网站造成压力,只采集 3 页。

打开网址,按F12,我们可以看到页面 html 如下:

爬虫代码如下:

from DrissionPage import SessionPage

# 创建页面对象
page = SessionPage()

# 爬取3页
for i in range(1, 4):
    # 访问某一页的网页
    page.get(f'https://gitee.com/explore/all?page={i}')
    # 获取所有开源库<a>元素列表
    links = page.eles('.title project-namespace-path')
    # 遍历所有<a>元素
    for link in links:
        # 打印链接信息
        print(link.text, link.link)

Pycharm 控制台输出如下,项目名称和链接都爬取到了:

三、定位元素

爬网页简单来说就是提取一些页面元素,定位到元素,就可以进行输出、保存等操作。

一些常用的元素定位方式如下,基本逻辑和 Selenium 方式类似,但是更简洁。

# 根据 class 或 id 查找
page.ele('#ele_id')  # 等价于 page.ele('@id=ele_id')
page.ele('#:ele_id')  # 等价于 page.ele('@id:ele_id')
page.ele('.ele_class')  # 等价于 page.ele('@class=ele_class')
page.ele('.:ele_class')  # 等价于 page.ele('@class:ele_class')

# 根据 tag name 查找
page.ele('tag:li')  # 查找第一个 li 元素  
page.eles('tag:li')  # 查找所有 li 元素  

# 根据 tag name 及属性查找
page.ele('tag:div@class=div_class')  # 查找 class 为 div_class 的 div 元素

四、实战案例:爬拉勾网

在拉勾网爬取 Python 职位的招聘信息,获取公司、职位、薪资等信息。

目标网址https://www.lagou.com/wn/zhaopin?kd=Python&pn=2

分析网址 url,只有pn参数是变化的,通过改变pn参数的值就可以实现翻页效果。

根据定位元素的方法,分析网页元素信息,可以定位到职位 div、company、company、money 这些信息。定位方法如下:

divs = page.eles('tag:div@class=item__10RTO')
company = div.ele('.company-name__2-SjF')
company = div.ele('#openWinPostion')
money = div.ele('.money__3Lkgq')

定位到元素,就可以写爬虫代码了,还是比较简单的。在我公众号多看几篇 Python 实战,应该可以毫无压力写出代码,下面直接给出完整爬虫代码。代码如下:

from DrissionPage import SessionPage
import pandas as pd

# contents列表用来存放所有爬取到的职位信息
contents = []

# 创建页面对象
page = SessionPage()

# 爬取30页
for i in range(1, 31):
    # 访问某一页的网页
    page.get(f'https://www.lagou.com/wn/zhaopin?kd=Python&pn={i}')
    # 查找 class 为 item__10RTO 的 div 元素
    divs = page.eles('tag:div@class=item__10RTO')
    # 提取公司、职位、薪资
    for div in divs:
        company = div.ele('.company-name__2-SjF')
        position = div.ele('#openWinPostion')
        money = div.ele('.money__3Lkgq')
        contents.append([company.text, position.text, money.text])
    print("正在爬取第", i, "页,总计获取到", len(contents), "条职位信息")

# 保存到csv文件
name = ['company', 'position', 'money']
contents_df = pd.DataFrame(columns=name, data=contents)
contents_df.to_csv("拉勾网Python职位信息.csv", index=False)

Pycharm 控制台输出如下,爬取了 30 个网页,总计获取到 450 条职位信息:

打开 csv 文件查看数据,截图如下:

五、项目链接

项目主页:https://g1879.gitee.io/drissionpagedocs/

文档地址https://g1879.gitee.io/drissionpagedocs/

六、总结

通过这个实战案例,不得不说 DrissionPage 这个库真的牛逼。不用安装浏览器驱动了,元素定位也更简洁,爬虫效率也很高。

当然,本文只是一个入门,更多使用技巧可以到作者的项目主页食用,项目文档写的也很清晰易懂。

本文首发在“程序员coding”公众号,欢迎关注与我一起交流学习。

  • 51
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
环境要求 建议使用conda虚拟环境部署,python版本要求大于或等于``3.6`` 环境安装 首先你需要将本项目克隆到你本地。 然后您只需要使用下面命令即可一键安装所需的环境 ```bash pip3 install -r requirements.txt ``` 如果pip下载速度较慢,请使用下面这个命令 ``` pip3 install -r requirements.txt -i http://pypi.douban.com/simple/ ``` 配置 在使用前,你需要完成一些基本配置 所有配置你只需要在``config.py``文件中完成,如果你不懂任何技术,请不要修改除``config.py``文件外的任何文件。 你主要是需要去配置``LIVE_URL``选项,去指定直播间的地址,配置实例 ```py LIVE_URL = r"https://live.kuaishou.com/u/KPL704668133" ``` 上面这个代码我指定了KPL直播间地址。 其次,你需要配置``BROWSER_PATH``选项,该选项需要你指定浏览器可执行文件的路径,在默认的配置中,我使用了``edge``浏览器作为驱动。 你可以配置任何使用``chromium``内核构建的浏览器,例如``Microsoft Edge``或者是``Google Chrome``等。 ```py BROWSER_PATH = r'C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe' ``` 其他选项对于本项目的运行影响不大,你可以看选项上面的注释进行配置 运行 如果你完成了上述的配置,使用以下命令进行启动本项目 ```bash python main.py ``` 未知礼物 由于时效性问题,可能导致一些礼物无法识别,此时,你需要额外配置一些未知的礼物。 程序会将获取到的未知的例如默认存放到``unknow_gift``目录(你可以在``config.py``中修改这个路径),名称为:礼物图片md5.png,你需要将``礼物图片md5``改为礼物真实的名称,例如,原始文件名``580c253e0bd3cc4212f7087d110691ed.png``,你需要改为``粉丝团.png`` 最后你需要执行以下命令完成礼物的导入 ```shell python import_git.py ``` 事件开发 如果你在获取到礼物、收到聊天信息、收到点赞后想实现一些业务流程处理,你需要在``handle.py``中实现。 该文件中共实现了三个方法,分别为``message``、``like``、``gift``分别代表了``消息``、``点赞``、``礼物`` 代码如下 ```py """ 收到弹幕消息会调用这个函数 """ def message(username,text): pass """ 收到点赞消息会调用这个函数 """ def like(username): pass """ 收到礼物消息会调用这个函数,如果未知礼物,gift_name 为 None """ def gift(username,gift_name): pass ``` ``message``函数会传入两个参数,分别为``username``和``text``,顾名思义``username``就是谁发的消息,``text``就是发的什么消息。 ``like``函数会传入一个参数,为``username``,就是谁点了赞。 ``gift``函数会传入两个参数,为`username`和``gift_name``,``username``是送礼物的人,``gift_name``就是礼物名称,如果遇到了未知礼物,则传入的为None
好的,我可以帮你写一个Python爬虫代码,使用requests和BeautifulSoup爬取拉勾职位信息。以下是代码: ```python import requests from bs4 import BeautifulSoup def get_job_info(url): response = requests.get(url) soup = BeautifulSoup(response.text, 'html.parser') job_name = soup.select('.job-name')[0].text.strip() salary = soup.select('.job_request .salary')[0].text.strip() experience = soup.select('.job_request p')[1].text.strip() education = soup.select('.job_request p')[2].text.strip() tags = [tag.text.strip() for tag in soup.select('.position-label li')] company = soup.select('.company')[0].text.strip() return {'Job': job_name, 'Salary': salary, 'Experience': experience, 'Education': education, 'Tags': tags, 'Company': company} def get_jobs_list(city, keyword, pages=1): jobs_list = [] for page in range(1, pages+1): url = f'https://www.lagou.com/{city}/zhaopin/{keyword}/{str(page)}/?filterOption=3' response = requests.get(url) soup = BeautifulSoup(response.text, 'html.parser') job_items = soup.select('.itemcon') for job in job_items: job_url = job.select('.positionlink')[0].get('href') job_info = get_job_info(job_url) jobs_list.append(job_info) return jobs_list jobs = get_jobs_list('beijing', 'python', pages=2) for job in jobs: print(job) ``` 该爬虫代码可以爬取拉勾北京地区Python职位信息。你可以替换city和keyword变量的值来搜索其他城市和职位需求。pages参数是可选的,默认为1,如果设置为2,则爬取前两页的职位信息。 以上是该爬虫代码的实现,如果你有其他问题,可以随时问我。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值