Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 824|回复: 0

python爬虫headers设置后无效解决方案

[复制链接]
  • TA的每日心情
    奋斗
    2024-11-24 15:47
  • 签到天数: 804 天

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    726782
    发表于 2021-6-26 11:33:51 | 显示全部楼层 |阅读模式

    此次遇到的是一个函数使用不熟练造成的问题,但有了分析工具后可以很快定位到问题(此处推荐一个非常棒的抓包工具fiddler)

     

    正文如下:

    在爬取某个app数据时(app上的数据都是由http请求的),用Fidder分析了请求信息,并把python的request header信息写在程序中进行请求数据

    代码如下

    import requests
    url = 'http://xxx?startDate=2017-10-19&endDate=2017-10-19&pageIndex=1&limit=50&sort=datetime&order=desc'
    
    headers={
        "Host":"xxx.com",
        "Connection": "keep-alive",
        "Accept": "application/json, text/javascript, */*; q=0.01",
        "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.59 Safari/537.36",
        "X-Requested-With": "XMLHttpRequest",
        "Referer": "http://app.jg.eastmoney.com/html_Report/index.html",
        "Accept-Encoding": "gzip,deflate",
        "Accept-Language": "en-us,en",
        "Cookie":"xxx"
    }
    r = requests.get(url,headers)
    print (r.text)

    请求成功但是,返回的是

    {"Id":"6202c187-2fad-46e8-b4c6-b72ac8de0142","ReturnMsg":"加载失败!"}

    就是被发现不是正常请求被拦截了

     

    然后我去Fidder中看刚才python发送请求的记录 #盖掉的两个部分分别是Host和URL,

     

    然后查看请求详细信息的时候,请求头并没有加载进去,User-Agent就写着python-requests !   #请求头里的UA信息是java,python程序,有点反爬虫意识的网站、app都会拦截掉

    Header详细信息如下

    GET http://xxx?istartDate=2017-10-19&endDate=2017-10-19&pageIndex=1&limit=50&sort=datetime&order=desc
      &Host=xxx.com
      &Connection=keep-alive
      &Accept=application%2Fjson%2C+text%2Fjavascript%2C+%2A%2F%2A%3B+q%3D0.01
      &User-Agent=Mozilla%2F5.0+%28Windows+NT+6.1%3B+WOW64%29+AppleWebKit%2F537.36+%28KHTML%2C+like+Gecko%29+Chrome%2F29.0.1547.59+Safari%2F537.36
      &X-Requested-With=XMLHttpRequest
      &Referer=xxx
      &Accept-Encoding=gzip%2Cdeflate
      &Accept-Language=en-us%2Cen
      &Cookie=xxx
    HTTP/1.1

    Host: xxx.com User-Agent: python-requests/2.18.4 Accept-Encoding: gzip, deflate Accept: */* Connection: keep-alive HTTP/1.1 200 OK Server: nginx/1.2.2 Date: Sat, 21 Oct 2017 06:07:21 GMT Content-Type: application/json; charset=utf-8 Content-Length: 75 Connection: keep-alive Cache-Control: private X-AspNetMvc-Version: 5.2 X-AspNet-Version: 4.0.30319 X-Powered-By: ASP.NET

     

    一开始还没发现,等我把请求的URL信息全部读完,才发现程序把我的请求头信息当做参数放到了URL里

     

    那就是我请求的时候request函数Header信息参数用错了

    又重新看了一下Requests库的Headers参数使用方法,发现有一行代码写错了,在使用request.get()方法时要把参数 “headers =“写出来  

    更改如下:

    import requests
    url = 'http://xxx?startDate=2017-10-19&endDate=2017-10-19&pageIndex=1&limit=50&sort=datetime&order=desc'
    
    headers={
        "Host":"xxx.com",
        "Connection": "keep-alive",
        "Accept": "application/json, text/javascript, */*; q=0.01",
        "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.59 Safari/537.36",
        "X-Requested-With": "XMLHttpRequest",
        "Referer": "http://app.jg.eastmoney.com/html_Report/index.html",
        "Accept-Encoding": "gzip,deflate",
        "Accept-Language": "en-us,en",
        "Cookie":"xxx"
    }
    r = requests.get(url,headers=headers)

     

    然后去查看Fiddler中的请求,

    此次python中的请求头已经正常了,请求详细信息如下

    GET http://xxx?startDate=2017-10-19&endDate=2017-10-19&pageIndex=1&limit=50&sort=datetime&order=desc HTTP/1.1
    User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.59 Safari/537.36
    Accept-Encoding: gzip,deflate
    Accept: application/json, text/javascript, */*; q=0.01
    Connection: keep-alive
    Host: xxx.com
    X-Requested-With: XMLHttpRequest
    Referer: http://xxx
    Accept-Language: en-us,en
    Cookie: xxx
    
    
    HTTP/1.1 200 OK
    Server: nginx/1.2.2
    Date: Sat, 21 Oct 2017 06:42:21 GMT
    Content-Type: application/json; charset=utf-8
    Content-Length: 75
    Connection: keep-alive
    Cache-Control: private
    X-AspNetMvc-Version: 5.2
    X-AspNet-Version: 4.0.30319
    X-Powered-By: ASP.NET

     

    然后又用python程序请求了一次,结果请求成功,返回的还是

    {"Id":"6202c187-2fad-46e8-b4c6-b72ac8de0142","ReturnMsg":"加载失败!"}

     

    因为一般cookie都会在短时间内过期,所以更新了cookie,然后请求成功

     

     

    需要注意的是用程序爬虫一定要把Header设置好,这个app如果反爬的时候封ip的话可能就麻烦了。

     

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-12-22 22:49 , Processed in 0.055953 second(s), 27 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表