实用小技巧:为何浏览器能访问,爬虫代码却失败?

请问把 ~~大象装进冰箱~~ ,写python爬虫拢共分为几个步骤?

  • 1、用fiddler等工具抓包分析

  • 2、用requests & BeautifulSoup实现

  • 3、debug

  • 4、部署

万事大吉。

不对,很多时候我们会卡在第三步,明明看代码没有任何问题,可就是获取不到自己想要的结果? 仔细再对了代码还是没有任何问题。此时,我们首要想到的是:

对自己的爬虫程序进行抓包,与原始请求进行比对,确认自己程序的请求包与抓包软件所发出的是一模一样的

0x1 那如何对自己的程序发出的原始请求进行抓取?

1、当然最简单的方式就是直接使用抓包软件开启代理,进行抓取自己的程序的包。 废话少说,先上代码:

import requests

url="https://www.baidu.com"
headers={
... #省略
}
requests.get(url,headers=headers,verify=False)

以上咱们需要记住,因为代理软件的证书是自己生成的,所以requests请求https类型的网站会验证失败导致请求不成功,所以在requests请求把verify字段设置为False,略过证书验证。

但是如果我们程序有几十个请求,那每一个都要设置verify=False吗?

不用。我们可以用python提供的functools批量设置。代码如下:

from functools import partial 

requests.get=partial(requests.get,verify=False)
requests.post=partial(requests.post,verify=False)

partial将requests.get的参数verify设置为Fasle,并返回新的函数,新的函数替换掉 原来的requests.get,对于post请求也是类似。大家可以在程序开头这样设置,这样所以的请求verify都为False了。

另外需要注意的是,如果代理不在本机或者代理为开启全局代理,我们需要手动设置代理:

from functools import partial 
proxy={"http":"127.0.0.1:8888","https":"127.0.0.1:8888"}
requests.get=partial(requests.get,verify=False,proxies=proxy)
requests.post=partial(requests.post,verify=False,proxies=proxy)

欲穷千里目,更上一层楼。我们更进一步

0x2 如何不通过代理获取原始请求?

如果我们在服务器上进行调试,不是很方便获取原始请求,那我们对底层的函数进行hook。 先上代码

import sys
if sys.version>'3':
    from urllib3.packages.six.moves import http_client as httplib
else:
    import httplib
def patch_send():
    old_send= httplib.HTTPConnection.send
    def new_send( self, data ):
        print(data)
        return old_send(self, data)
    httplib.HTTPConnection.send= new_send

以上代码参考了stackoverflow上的一个回答,原答案只有python2版本,针对python3我对其进行了兼容修改,修改主要是httplib的地方。 代码会自动打印出原始http请求的格式,与fiddler的Raw有异曲同工之妙,例如这种就是patch_send函数print出来的http原始报文。如果我们有自己的日志函数,可以稍加修改将其加入其中,对于我们排查故障特别有效果。:

GET https://www.fiddler2.com/UpdateCheck.aspx?isBeta=False HTTP/1.1
User-Agent: Fiddler/5.0.20194.41348 (.NET 4.7.1; WinNT 6.1.7601 SP1; zh-CN; 2xAMD64; Auto Update; Full Instance; Extensions: APITesting, AutoSaveExt, EventLog, FiddlerOrchestraAddon, HostsFile, RulesTab2, SAZClipboardFactory, SimpleFilter, Timeline)
Pragma: no-cache
Host: www.fiddler2.com
Accept-Language: zh-CN
Referer: http://fiddler2.com/client/5.0.20194.41348
Accept-Encoding: gzip, deflate
Connection: close

以上,谢谢阅览。大家可以扫描以下二维码关注本公众号,后期会有更多实用小技巧更新。

欢迎关注,必有所得

防止失联,关注微信公众号:码道工程。

历史文章

本文作者:小码哥

本文链接:http://www.tnt0.com/archives/3

版权声明:本博客所有文章除特别声明外,均采用CC BY-NC-SA 3.0许可协议。转载请注明出处!

android逆向常用命令笔记... <<
0 条评论

请先登陆注册

已登录,注销 取消