爬虫----拉勾网

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

                                           爬取拉勾网

废话不多说,开干!

拿到想爬取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}
遭遇了反爬
"""
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
由于涉及到爬取,可能侵犯拉勾的相关规定和法律法规。因此,我们强烈建议您遵守相关规定,合法合规地进行爬取。 以下是简单的示例代码,用于爬取拉勾上的招聘信息: ```java import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import java.io.IOException; public class LaGouSpider { public static void main(String[] args) { String url = "https://www.lagou.com/zhaopin/Java/"; try { Document doc = Jsoup.connect(url).get(); Elements jobList = doc.select(".job-list li"); for (Element job : jobList) { String jobName = job.select(".position_link h3").text(); String company = job.select(".company_name a").text(); String salary = job.select(".money").text(); System.out.println("职位名称:" + jobName); System.out.println("公司名称:" + company); System.out.println("薪资待遇:" + salary); System.out.println("------------------------"); } } catch (IOException e) { e.printStackTrace(); } } } ``` 这个示例代码使用了Jsoup库,通过连接拉勾的Java职位页面,获取页面上的招聘信息。具体步骤如下: 1. 使用Jsoup.connect()方法连接要爬取的页面。 2. 使用doc.select()方法选择页面上需要提取的元素。 3. 遍历选择的元素,使用element.select()方法获取元素内的具体信息。 需要注意的是,由于拉勾的页面结构可能随时改变,所以代码需要根据实际情况进行调整。此外,如果您要进行大规模的爬取,需要加入相关的限制和措施,以避免对站造成过大的负担和影响。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值