Python入门学习:应用random函数随机生成HTTP请求headers信息

技术 赵有财 12730℃ 0评论

为什么抓取会收到限制

要采集百度数据,查询关键词排名等,因为短时间内发出太多的请求,会受到百度局域网异常访问屏蔽策略的限制。
出现以下错误信息:
error
要突破这样的限制,必须伪装成为真正的用户(真正用户大量搜索也会出现)访问,就能降低这样情况发生的概率。

举个栗子:
我们不做任何处理,直接使用Python的urllib.request.urlopen方法打开页面看看是什么情况。运行以下代码:

import urllib.request
res = urllib.request.urlopen('http://www.baidu.com')

504

Python-urllib-ua

发生错误了,抓不到内容,我们用Fiddler抓包工具查看详细的请求信息,Python的请求信息非常简单,User-Agent信息是Python-urllib/3.3,这样就不是真正用户的请求信息。

如何查看http报文header消息

那真正的用户请求信息应该是什么样的呢?我们来真正访问以下百度,用fiddler抓包,没有fiddler也可以用Chrome浏览器的network查看。

request-headers

如何构造Header报头消息的请求

那怎么伪装成真正的用户呢,首先我们要了解Python的urllib.request模块的相关函数,urlopen函数是无法传递header消息的:

urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)

要携带header消息,就要用的Request类:

class urllib.request.Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None)

其中的headers字典就是我们需要构造和传递的了。我们只要了解使用的方法就好,先来构造一下header吧:

headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11',
           'Accept':'text/html;q=0.9,*/*;q=0.8',
           'Accept-Charset':'ISO-8859-1,utf-8;q=0.7,*;q=0.3',
           'Accept-Encoding':'gzip',
           'Connection':'close'
}

然后就使用Request类了,

url = 'http://www.baidu.com/'
req = urllib.request.Request(url, headers = headers)

接下来就再用urlopen方法请求页面,为了验证,我们将状态码打印出来:

res = urllib.request.urlopen('http://www.baidu.com')
print(res.status)

我们用fiddler抓到的数据来看看,
302

ua-rand

header信息正常的和请求一起发松给服务器了。另外上面我们看到了有一个302的状态,因为百度现在全站启用了https协议,我们的情景会自动重定向到https://www.baidu.com。

另外,查看了官方文档,还有一个函数可以携带header消息请求的,官方举栗子如下:

import urllib.request
opener = urllib.request.build_opener()
opener.addheaders = [('User-agent', 'Mozilla/5.0')]
opener.open('http://www.zhaoyoucai.com/')

光有一个UA还不够:

经过上面的代码,我们就能够被当做正常用户访问了,不过如果并发大量的请求还是要被禁封一段时间的,就需要切换不同的UA,随机暂停一下,那我们就要用的random模块了。先来看看代码吧

import random

def randHeader():
    
    head_connection = ['Keep-Alive','close']
    head_accept = ['text/html, application/xhtml+xml, */*']
    head_accept_language = ['zh-CN,fr-FR;q=0.5','en-US,en;q=0.8,zh-Hans-CN;q=0.5,zh-Hans;q=0.3']
    head_user_agent = ['Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko',
                       'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36',
                       'Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; rv:11.0) like Gecko)',
                       'Mozilla/5.0 (Windows; U; Windows NT 5.2) Gecko/2008070208 Firefox/3.0.1',
                       'Mozilla/5.0 (Windows; U; Windows NT 5.1) Gecko/20070309 Firefox/2.0.0.3',
                       'Mozilla/5.0 (Windows; U; Windows NT 5.1) Gecko/20070803 Firefox/1.5.0.12',
                       'Opera/9.27 (Windows NT 5.2; U; zh-cn)',
                       'Mozilla/5.0 (Macintosh; PPC Mac OS X; U; en) Opera 8.0',
                       'Opera/8.0 (Macintosh; PPC Mac OS X; U; en)',
                       'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.12) Gecko/20080219 Firefox/2.0.0.12 Navigator/9.0.0.6',
                       'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Win64; x64; Trident/4.0)',
                       'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)',
                       'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.2; .NET4.0C; .NET4.0E)',
                       'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Maxthon/4.0.6.2000 Chrome/26.0.1410.43 Safari/537.1 ',
                       'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.2; .NET4.0C; .NET4.0E; QQBrowser/7.3.9825.400)',
                       'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:21.0) Gecko/20100101 Firefox/21.0 ',
                       'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.92 Safari/537.1 LBBROWSER',
                       'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0; BIDUBrowser 2.x)',
                       'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.11 TaoBrowser/3.0 Safari/536.11']
    
    
    header = {
        'Connection': head_connection[0],
        'Accept': head_accept[0],
        'Accept-Language': head_accept_language[1],
        'User-Agent': head_user_agent[random.randrange(0,len(head_user_agent))]
    }
    return header

print(randHeader())

上面的代码定义了一个随机生成header的函数,返回一个header字典,根据字典的各个字段都定义了数组方便扩展,使用random.randrange()函数来生成数组的下标,这样就可以随机的下标,就随机产生Ua了。运行上面的代码就可以随机生成字典了。

总结,随机函数是个非常实用的函数,不管是什么语言都会用到,它让程序变得更加自然,为了能用Python写出一些SEO的应用,还是有许多理论知识要补课的,比如HTTP协议、Python库函数、Fiddler工具,基本的英文等。
Python库函数参考:https://docs.python.org/3/library/urllib.request.html#urllib.request.BaseHandler

转载请注明:「知而不乎」 » Python入门学习:应用random函数随机生成HTTP请求headers信息

喜欢 (39)or分享 (0)
如果你觉得这篇文章还有价值,对你有帮助,请支持我继续更新 !捐赠本站

关注微信公众号

知而不乎微信公众号