请问把 ~~大象装进冰箱~~ ,写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
以上,谢谢阅览。大家可以扫描以下二维码关注本公众号,后期会有更多实用小技巧更新。
防止失联,关注微信公众号:码道工程。
请先登陆 或 注册