爬虫----拉勾网

今天跟着视频学习了爬取拉勾网,很着学习下来,收获颇多。。。。。。

                                           爬取拉勾网

废话不多说,开干!

拿到想爬取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}
遭遇了反爬
"""