python3爬取拉勾网职位信息

爬取拉勾网的最大障碍:普通模块难以实现翻页爬取。自己加了参数page,经过抓包查询之后也达不到我的理想要求。

没办法了,只好用selenium模块结合浏览器来实现边翻页边爬取了。

实际上比较浪费系统资源,这种情况不得已还是尽量别用的好。

在此记录下主要的过程,包括实现的代码。

还是要说明一下:不懂的地方还是需要自己去查询了解,代码不过就是几个模块的知识运用罢了。

前提

启动Chrome**webdriver插件,之后复制其所在地址,加入代码中启动selenium模块程序。

启动插件。

本机此插件所在的目录位置。

分析过程

经过简单的分析,发现页面的切换的同时URL没有任何的改变(这就是我为何要用selenium来爬取的原因!):

我们的目标是,点击在此符合条件的发布公司链接,进入招聘信息详细的界面爬取详细的所有需要的信息:

一一进入进行爬取。

进入之后详细的招聘信息页面。

那么思路一下就出来了:用selenium模块实现翻页的功能,并且返回对应页面的源代码,并且一一进行分析提取即可。

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
"""
函数目标:
翻页爬取拉勾网的职位信息
编写时间:
2018-05-05
"""
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
from pyquery import PyQuery as pq
from urllib.parse import quote
import requests
import re
import time
# 启动对象驱动,并且设置预期的等待时间
browser = webdriver.Chrome('/Users/junjieliu/Downloads/webdirver小插件/chromedriver')
wait = WebDriverWait(browser, 10)
def page_content(pages):
"""
返回每一页的页面源代码,顾名知义,从URL中可知许多的筛选信息了,可自行选择,
在此仅以职位关键词职位作为输入。
"""
print('-' * 10 + '正在爬取第' + str(pages) + '页的内容' + '.' * 6)
keyword = '数据分析师' # 职位关键词
url = 'https://www.lagou.com/jobs/list_' + quote(keyword) + '?' + 'px=default&gx=实习&gj=&xl=本科&isSchoolJob=1&city=全国#filterBox'
browser.get(url)
if pages > 1:
# 如果页面数大于1页则启用自动翻页
next_botton = wait.until(
EC.element_to_be_clickable((By.CSS_SELECTOR, '#s_position_list > div.item_con_pager > div > span.pager_next')))
next_botton.click()
# 指定要爬取区域,非必须要写
wait.until(
EC.presence_of_element_located((By.CSS_SELECTOR, '#s_position_list > ul > li.con_list_item')))
print('爬取此页源码成功!以下是本页一系列相关的内容:')
informations_save()
def informations_save():
"""
一一进入内部URL,爬取详细的招聘信息!
"""
source_code = browser.page_source
doc = pq(source_code)
url = re.findall(r'class="position_link".*?href="(.*?)"', source_code, re.S) # @UndefinedVariable
for i in range(0, len(url)):
header = {
'Connection': 'keep-alive',
'Host': 'www.lagou.com',
'Upgrade-Insecure-Requests': '1',
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36'
}
response = requests.get(url=url[i], headers=header)
response.encoding = 'utf-8'
doc1 = pq(response.text)
infor = {
'company':doc1.find('body > div.position-head > div > div.position-content-l > div > div.company').text(), # 公司名称
'infor_url':doc1.find('#job_company > dt > a').attr('href'), # 此公司详细介绍网站
'position':doc1.find('body > div.position-head > div > div.position-content-l > div > span.name').text(), # 职位
'salary':doc1.find('body > div.position-head > div > div.position-content-l > dd > p:nth-child(1) > span.salary').text(), # 工资
'locale':doc1.find('#job_detail > dd.job-address.clearfix > input[type="hidden"]:nth-child(6)').text().replace('/', ''), # 地点
'place':doc1.find('#job_detail > dd.job-address.clearfix > div.work_addr').text(), # 具体位置
'required':doc1.find('div.position-content-l > dd > p:nth-child(1) > span:nth-child(3)').text().replace('/', ''), # 经验要求
'education':doc1.find('div.position-content-l > dd > p:nth-child(1) > span:nth-child(4)').text().replace('/', ''), # 学历要求
'job_nature':doc1.find('div.position-content-l > dd > p:nth-child(1) > span:nth-child(5)').text().replace('/', ''), # 工作性质
'attract':doc1.find('#job_detail > dd.job-advantage').text().replace('\n', ' '), # 工作诱惑
'describe':doc1.find('#job_detail > dd.job_bt').text().replace('\n', ' ') # 工作描述
}
print(infor)
if __name__ == "__main__":
pages = 6 # 总的页面数,从网页第一面就可知了,6是测试用的数字页码
for i in range(1, pages + 1):
page_content(i)
time.sleep(20)

最后我选择将爬取的内容保存至一个.txt文件下。

效果

运行之后的效果,有些爬取不了,明明源代码都没什么变化…

最后

  • 这个代码的模型并不能爬取页面上对应的全部内容,这个我也是有点疑惑。

  • 有时会跳到需要登录的界面,重新来几次就行了,总有一次能爬取。

有不懂的知识可参考:https://cuiqingcai.com/5630.html

以及相关的模块的官网亦可。

---------------本文终---------------

文章作者:刘俊

最后更新:2019年01月02日 - 14:01

许可协议: 转载请保留原文链接及作者。