urllib是python中常用的一个基本库,以后的许多库包括一些框架如Scrapy都是建立在这个库的基础上的。在urllib中,为用户提供了一系列用于操作URL的功能,其提供的功能主要就是利用程序去执行各种HTTP请求。这当中,最常使用的就是urllib.request模块中的urlopen。
如果要模拟浏览器完成特定功能,需要把请求伪装成浏览器。伪装的方法是先监控浏览器发出的请求,再根据浏览器的请求头来伪装,User-Agent
头就是用来标识浏览器的。
官方给出的方法原型是这样的:
def urlopen(url, data=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT, *, cafile=None, capath=None, cadefault=False, context=None):
一般常用的为以下三个部分:
url: 需要打开的网址
data:Post提交的数据
timeout:设置网站的访问超时时间
但是urlopen也有很大的缺陷,就是他没有办法进行对爬虫进行伪装,也就是无法设置请求头,这就需要urllib中的另外一个库——request,request库提供了对于请求头的使用,用来进行对爬虫的伪装,一般来说,我们会设置几个不同的Headers来进行伪装,用来改变为不同的用户(在自我学习阶段,这样可以使要求不严格的spider减少对ip的改变)。下面的代码基本实现了这种方式的基本操作,并且对于urlopen和request的常用的方法进行了罗列(以www.bing.com为例)。
1 ''' 2 @Description: urllib 的使用和进阶 3 @Version: 1.0 4 @Autor: Montoin Yan 5 @Date: 2020-02-01 17:55:43 6 @LastEditors : Montoin Yan 7 @LastEditTime : 2020-02-01 19:46:27 8 ''' 9 10 #导入urllib中的resqust模块,引用urlopen 11 #urlopen方法用于发送请求,并将请求到的结果储存在文件中。缺点是不能使用header的引用 12 #因此引用Request库进行请求头的引用,方便伪装来逃避反扒措施 13 from urllib.request import urlopen,Request 14 import random 15 #当查询到response中的type时,可以按照以下格式进行具体方法的查询 16 from http.client import HTTPResponse 17 18 url = "http://www.bing.com" 19 #设置多个请求头,防止被反扒措施进行拦截 20 ua_list = [ 21 "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:72.0) Gecko/20100101 Firefox/72.0", 22 "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.29 Safari/537.36", 23 "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.18362", 24 "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3741.400 QQBrowser/10.5.3863.400" 25 ] 26 #随机pick one 27 ua = random.choice(ua_list) 28 request = Request(url,headers={ 29 'User-agent':ua 30 }) 31 # response = urlopen(url,timeout=3) #GET 32 response = urlopen(request,timeout=3) 33 34 print(response.closed) #可以使用closed,说明是类文件对象, 35 36 with response: 37 print(type(response)) #检查response的对应的方法类型 38 print(response.status) #检查response的状态 39 print(response.reason) #检查返回结果是否成功 40 print(response._method) #检查当前所对应的传输方法 即GET或者POST 41 # print(response.info()) #获取Headers 42 # print(response.read()) #读取并打印获取到的文件的内容 43 print(response.geturl()) #返回网页执行真正的url,即当遇到301 302的时候,页面会从当前页面自动跳转到location页面,具体location地址可以在浏览器的开发者模式中进行查看urllib是支持自动跳转的 44 45 print(request.get_method()) #获取request中传输的方法,即GET或者POST 46 print(request.get_header("User-agent")) #获取当前使用的请求头 47 print(response.closed) #关闭成功,说明response支持上下文管理协议
结果如下所示,可进行参考:
来源:https://www.cnblogs.com/yandashan666/p/12249812.html