一、前言
利用selenium+requests访问页面爬取拉勾网招聘信息
二、分析url
观察页面可知,页面数据属于动态加载 所以现在我们通过抓包工具,获取数据包
观察其url和参数
1
2
3
4
5
6
|
url = "https://www.lagou.com/jobs/positionajax.json?px=default&needaddtionalresult=false"
参数:
city = % e5 % 8c % 97 % e4 % ba % ac = = 》城市
first = true = = 》无用
pn = 1 = = 》页数
kd = % e6 % 95 % b0 % e6 % 8d % ae % e5 % 88 % 86 % e6 % 9e % 90 = = 》商品关键词
|
所以我们要想实现全站爬取,需要有city和页数
三、获取所有城市和页数
我们打开拉勾网,观察后发现,他的数据并不是完全展示的,比如说 在城市筛选选择全国 仅仅只显示30页 但总页数是远远大于30页的;我又选择北京发现是30页又选择北京下的海淀区又是30页,可能我们无法把数据全部的爬取,但我们可以尽可能的将数据多的爬取
我们为了获取全站数据,必然离不开的有两个参数 一个是城市一个是页数,所以我们利用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
|
def city_page( self ):
city_page = {}
url = "https://www.lagou.com/jobs/allcity.html?keyword=%s&px=default&companynum=0&iscompanyselected=false&labelwords=" % ( self .keyword)
self .bro.get(url = url)
sleep( 30 )
print ( "开始获取城市及其最大页数" )
if "验证系统" in self .bro.page_source:
sleep( 40 )
html = etree.html( self .bro.page_source)
city_urls = html.xpath( '//table[@class="word_list"]//li/input/@value' )
for city_url in city_urls:
try :
self .bro.get(city_url)
if "验证系统" in self .bro.page_source:
sleep( 40 )
city = self .bro.find_element_by_xpath( '//a[@class="current_city current"]' ).text
page = self .bro.find_element_by_xpath( '//span[@class="span totalnum"]' ).text
city_page[city] = page
sleep( 0.5 )
except :
pass
self .bro.quit()
data = json.dumps(city_page)
with open ( "city_page.json" , 'w' , encoding = "utf-8" )as f:
f.write(data)
return city_page
|
四、生成params参数
我们有了每个城市对应的最大页数,就可以生成访问页面所需的参数
1
2
3
4
5
6
7
8
9
10
11
12
13
|
def params_list( self ):
with open ( "city_page.json" , "r" )as f:
data = json.loads(f.read())
params_list = []
for a, b in zip (data.keys(), data.values()):
for i in range ( 1 , int (b) + 1 ):
params = {
'city' : a,
'pn' : i,
'kd' : self .keyword
}
params_list.append(params)
return params_list
|
五、获取数据
最后我们可以通过添加请求头和使用params url来访问页面获取数据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
def parse_data( self ,params):
url = "https://www.lagou.com/jobs/positionajax.json?needaddtionalresult=false"
header = {
'referer' : 'https://www.lagou.com/jobs/list_%e6%95%b0%e6%8d%ae%e5%88%86%e6%9e%90?labelwords=&fromsearch=true&suginput=' ,
'user-agent' : 'mozilla/5.0 (windows nt 10.0; win64; x64) applewebkit/537.36 (khtml, like gecko) chrome/89.0.4389.114 safari/537.36' ,
'cookie' :''
}
try :
text = requests.get(url = url, headers = header, params = params).text
if "频繁" in text:
print ( "操作频繁,已被发现 当前为第%d个params" % (i))
data = json.loads(text)
result = data[ "content" ][ "positionresult" ][ "result" ]
for res in result:
with open ( ".//lagou1.csv" , "a" ,encoding = "utf-8" ) as f:
writer = csv.dictwriter(f, res.keys())
writer.writerow(res)
sleep( 1 )
except exception as e:
print (e)
pass
|
六、总结
尽管数据只显示前30页,但数据还是未完全获取
在利用selenium获取城市最大页数时 应手动登录拉勾网,并且其在访问过程中可能会出现验证系统需要验证
利用requests访问页面获取数据时 尽量sleep时间长一点,操作频繁会封ip
到此这篇关于python爬虫之利用selenium+requests爬取拉勾网的文章就介绍到这了,更多相关selenium+requests爬取拉勾网内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!
原文链接:https://blog.csdn.net/weixin_47163937/article/details/115494265