今天跟着视频学习了爬取拉勾网,很着学习下来,收获颇多。。。。。。
爬取拉勾网
废话不多说,开干!
拿到想爬取python岗位的url地址:https://www.lagou.com/jobs/list_python/p-city_298?px=default#filterBox,然后想看一下网页的源码,打开一看:
what?这是怎么回事,啥子也没有?-------------------------------------
和简单的爬虫不一样,点开response不是html:
点开preview-->content---->result显示出来我们想要的信息了
原来是遭遇了反爬!
那就反反爬:用最简单的方法,加上user-agent:,但是显示出来是这样:
看来这个方法不行了,那就升级一下,加上 authority ,cookie , origin , referer , user-agent:
成功了!跟preview-->content---->result显示出来一样
正高兴的时候,再来一下。发现又失败了!
这是cookie失效了,没办法,在设置一下cookie,一般选最后一个:
想来想去,这样每次失败都设置一下cookie,这也太麻烦了吧。
那就写一段代码,自动访问获得cookie:
其中url是搜索python岗位的地址
其中:url_api地址是我搜索python工程师的地址:
然后把访问python地址的url 出来的cookie:
cookie_response = requests.get('https://www.lagou.com/jobs/list_python?labelWords=&fromSearch=true&suginput=',
headers={"user-agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) "
"AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36"})
用cookie_response.cookies得到cookies,赋值给cookies
cookies=cookie_response.cookies
这样就成功了,可以不受cookie失效的影响了
然后分析数据:点开第一页的python数据
然后打开剩下的:
分析了一下,第一页的first :true,剩下的页数first:为false,pn:跟页码匹配,kd也是一样的;第一页是没有的sid的,剩下的页数sid都不一样
showId就是前边的Headers,sid
获取数据,data 里面的content-->positionResult--->result,赋值给result,把data 里面的content-->showid赋值给sid
因为data里面的数据太多了,并不是我们都想要的,创建一个新字典,选取我们自己想要的信息
开始写入信息:
d.values()是打印出字典里面的“值“,如果不加f.write('\n')显示的数据是都在一行的。
执行:
爬取了五次之后,cookies失效了,可能是因为我们频繁的请求。那就加一个限制条件,每到第五页的时候就使调用cookies的代码:
然后在执行:爬取成功30页的数据!写入到csv的文件
以下是整个项目的源码:
import requests
import time
import pprint
sid=""
cookie_response = requests.get('https://www.lagou.com/jobs/list_python?labelWords=&fromSearch=true&suginput=',
headers={"user-agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36"})
for page in range(1,31):
if page %5==0: #因为cookie有次数限制,需要每个几次重新获取一下
#使用代码来获取cookie
cookie_response=requests.get('https://www.lagou.com/jobs/list_python?labelWords=&fromSearch=true&suginput=',headers={"user-agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36"})
print(cookie_response.cookies)
head={"authority":"www.lagou.com",
#"cookie": "X_HTTP_TOKEN=42daf4b72327b2817247467951bf5e71415983ed09; Max-Age=31536000; Path=/; Domain=.lagou.com",
"referer": "https://www.lagou.com/jobs/list_python?labelWords=&fromSearch=true&suginput=",
"user-agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36"}
if page==1:
data={
'first':'true',
'pn':'1',
'kd':'python'
}
else:
data = {
'first': 'alse',
'pn': str(page),
'kd': 'python',
'sid': sid
}
url_api="https://www.lagou.com/jobs/positionAjax.json?needAddtionalResult=false"
response=requests.post(url_api,
headers=head,
cookies=cookie_response.cookies,
data=data)
response.encoding=response.apparent_encoding
#pprint.pprint(response.json())
data=response.json()
print(data)
time.sleep(1)
result=data['content']['positionResult']['result']
sid=data['content']['showId']
# print(result)
#因为提取的数据多了,并不是全部想要的,所以要构建一个新的字典
for i in result:
d={
'city':i['city'],
'companyFullName':i['companyFullName'],
'companySize':i['companySize'],
'education':i['education'],
'positionName':i['positionName'],
'salary':i['salary'],
'workYear':i['workYear']
}
print(d)
with open('lagou.csv',mode='a',encoding="utf-8-sig")as f: # a, append 追加, 在文件的末尾写入内容
f.write(",".join(list(d.values())))
f.write('\n')
"""
{"status":false,"msg":"您操作太频繁,请稍后再访问","clientIp":"223.104.105.63","state":2402}
遭遇了反爬
"""