爬虫----拉勾网
今天跟着视频学习了爬取拉勾网,很着学习下来,收获颇多。。。。。。
爬取拉勾网
废话不多说,开干!
拿到想爬取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} 遭遇了反爬 """