Python爬虫之怼破反爬虫机制

一、准备

  • 先要准备一个浏览器,然后会解析头,当然,其他软件(如burpsuit也行)。
  • 然后选择一个网站。

二、正式开始

  1. 选好了网站:
    选择网站2. 我们尝试直接用普通的代码爬一下:
from bs4 import BeautifulSoup
import requests
import urllib
def main():
    result = requests.get("https://www.xxxxx.com/jobs/list_?px=new&gx=%E5%AE%9E%E4%B9%A0&gj=&xl=%E6%9C%AC%E7%A7%91&hy=%E"
                          "7%A7%BB%E5%8A%A8%E4%BA%92%E8%81%94%E7%BD%91&isSchoolJob=1&city=%E5%85%A8%E5%9B%BD#filterBox"
                         )

    print result.content

if  __name__=="__main__":
    main()

的出来的结果是返回拦截信息3. 很遗憾,爬不出来,这是因为这个网站设置了反爬虫机制,怎么办呢?

  • 我们回想一下,为什么我们用浏览器可以访问,而用requests访问不了呢?
  • 那是因为我们缺少相应的‘头’信息!
  • 那我们就加上头!
#coding=utf-8
from bs4 import BeautifulSoup
import requests
import urllib
def main():
    #创建一个头(请求头)
    header={

        "Host":"www.xxxxx.com",
        "Referer":"https://www.xxxxx.com/jobs/list_?px=new&gx=%E5%AE%9E%E4%B9%A0&gj=&hy=%E7%A7%BB%E5%8A%A8%E4%BA%92%E8%"
                  "81%94%E7%BD%91&isSchoolJob=1&city=%E5%85%A8%E5%9B%BD",
        "User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64; rv:68.0) Gecko/20100101 Firefox/68.0"
    }

    result = requests.get("https://www.xxxxx.com/jobs/list_?px=new&gx=%E5%AE%9E%E4%B9%A0&gj=&xl=%E6%9C%AC%E7%A7%91&hy=%E"
                          "7%A7%BB%E5%8A%A8%E4%BA%92%E8%81%94%E7%BD%91&isSchoolJob=1&city=%E5%85%A8%E5%9B%BD#filterBox"
                          ,headers=header)

    print result.content

if  __name__=="__main__":
    main()

这里需要注意一下:

  • Referer:你从哪个网站跳过来的
  • Host:主网站
  • user-agent:这是必须加进去的,不管是使用urllib还是requests还是scrapy框架

然后我们再试一下:(直接上对比图)
页面元素值查询表单(无数据)看到了吧~压根没数据!这时候就根据开发经验,可以晓得:

  • 这个很可能是通过异步数据加载来完成数据填充的,即Ajax

我们可以过滤Ajax包,就可以直接拿到它的数据了。
选择Ajax包

  • 这里我们这样过滤:选择XHR
  • 看到positionAjax吧啦吧啦的,选它
  • 查看当前内容,发现是POST请求!
  • 修改GET为POST,并且补充相应的表单数据(form_data)
  • 修改POST请求的链接为相应的***Ajax包的地址***,修改后代码如下:
   header={

        "Host":"www.lagou.com",
        "Referer":"https://www.xxxxx.com/jobs/list_?px=new&gx=%E5%AE%9E%E4%B9%A0&gj=&xl=%E6%9C%AC%E7%A7%91&hy=%E7%A7%BB"
                  "%E5%8A%A8%E4%BA%92%E8%81%94%E7%BD%91&isSchoolJob=1&city=%E5%85%A8%E5%9B%BD",
        "User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64; rv:68.0) Gecko/20100101 Firefox/68.0",
        "X-Anit-Forge-Code" : "0",
        "X-Anit-Forge-Token": None,
        "X-Requested-With":"XMLHttpRequest"
    }
    # POST还会发送一些数据体:“表单数据”
    form_data = {
    "first": "true",
    # 第几页
    "pn": "1",
    # 查询的关键字
    "kd": ""
    }

    result = requests.post("https://www.xxxxx.com/jobs/positionAjax.json?xl=%E6%9C%AC%E7%A7%91&hy=%E7%A7%BB%E5%8A%A8%E4%"
                           "BA%92%E8%81%94%E7%BD%91&px=new&gx=%E5%AE%9E%E4%B9%A0&needAddtionalResult=false&isSchoolJob=1"
                          ,headers=header, data=form_data)

然后检查一下json里面的内容,发现结构是这样的:
结构即: [‘content’][‘positionResult’][‘result’]

  • 因为是json包,所以可以用json模块进行分析(解析)
    json_result = result.json()
    positions = json_result['content']['positionResult']['result']
    #使用json模块格式化内容,不采用ascii格式
    line = json.dump(positions,ensure_ascii=False)
    #这里普及一下文件输入输出格式:w写 r读 rw rb...
    with open("spider.json",'w') as fp:
        #采用utf-8编码
        fp.write(line.encode('utf-8'))

好了,到了这一步,分析基本差不多了。可以由 ‘pn’ 页数来一页一页爬

但是!这个网站,又搞了一个反爬虫机制:不能连续爬,连续爬的后果是:

“您操作太频繁,请稍后再访问”
content没数据

怎么解决呢,emmm,最方便的就是

import time
time.sleep(3)

够简单吧。。。(当然,还是有可能爬不出来)

三、过滤数据

这个比较简单:用个字典,把需要报讯的额保存起来,这里就不展开讲了

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值