失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > python发起网络请求模块【requests selenium urllib urllib3】

python发起网络请求模块【requests selenium urllib urllib3】

时间:2019-12-03 22:12:57

相关推荐

python发起网络请求模块【requests selenium urllib urllib3】

python网络请求四大模块【requests、selenium、urllib、urllib3】

1、requests

该模块为python第三方库,需要使用pip安装

安装

pip install requests

使用

import requestsurl = ''response = requests.get(url)#使用get方法发起请求# response = requests.post(url) #使用post发起请求print(response.status_code) #输出请求状态码print(response.content.decode('utf-8')) #输出请求结果

requests的get方法以及其他方法中除了一个必不可少的URL参数可以还可以添加其他的相关参数从而提高爬虫请求的效率

1、header

2、cookies

3、proxies 【IP代理】

4、params 【请求携带参数】

import requests#使用请求头headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 ','Host': '','Referer': '/typerank?', }#携带cookiescookies = {'Cookie':' bid=vcLghJHKdzE; __utmz=30149280.1608554450.1.1.utmcsr=(direct)|utmccn='}#携带请求参数params = {'type':'11','interval_id':'100:90','action':'unwatched+playable','start':str(i*20),'limit':'20',}#设置代理池 ipproxy = {'http':'101.236.155.89:8899','https':'101.236.155.89:7799'}url = '/j/chart/top_list?'res=requests.get(url,headers=headers,params=params,cookies=cookies,proxies=proxy)print(response.status_code) #输出请求状态码print(response.content.decode('utf-8')) #输出请求结果

2、selenium

selenium模块可以用于自动化打开浏览器相当于用户主动操作,不用去刻意添加请求头、cookies等,可以大大增加爬虫的成功率

安装

selenium属于第三方库,需要pip安装

pip install selenium

使用

在使用该模块之前,需要配置和浏览器版本对应的浏览器驱动,谷歌浏览器下载驱动地址如下

/mirrors/chromedriver/

其他浏览器驱动请百度一下

驱动下载完毕后需要添加到环境变量,也可直接将驱动放到python的安装环境下面,建议放到python安装环境中

代码测试

from selenium import webdriverimport timeurl = 'http://localhost:5000/'# 设置静默模式,谷歌浏览器设置成后台运行,不会自动打开浏览器#options = webdriver.ChromeOptions()#options.add_argument('headless')#driver = webdriver.Chrome(chrome_options=options)# 自动打开浏览器driver = webdriver.Chrome()driver.get(url)time.sleep(2) # 暂停两秒,等待浏览器缓冲print(driver.page_source) #输出访问地址的整个页面代码driver.quit() # 关闭浏览器

selenium模块自动化脚本测试模块,功能非常强大,相当于人为操作浏览器,这里只是抛砖引玉。需要详细了解的可以直接在CSDN或者百度中搜索进行学习

3、urllib

原文来自:/pywjh/p/9689734.html

别人写的太好太明白,自己主要起个 c v 的作用,以免画蛇添足,建议大家可以直接去看原文。

urllib作为Python的标准库,基本上涵盖了基础的网络请求功能。

urllib.request

urllib中,request这个模块主要负责构造和发起网络请求,并在其中加入Headers、Proxy等。

发起GET请求

主要使用urlopen()方法来发起请求:

from urllib import request​resp = request.urlopen('')print(resp.read().decode('utf-8')) #使用对象的read()方法获得bytes数据。然后进行decode转码

发起POST请求

urlopen()默认的访问方式是GET,当在urlopen()方法中传入data参数时,则会发起POST请求。

注意:传递的data数据需要为bytes格式。

设置timeout参数还可以设置超时时间,如果请求时间超出,那么就会抛出异常。

from urllib import request​#加上data参数发起POST请求并设置超时时间resp = request.urlopen('', data=b'word=hello', timeout=10)print(resp.read().decode()) #同样需要转码

添加Headers

通过urllib发起的请求会有默认的一个Headers:“User-Agent”:“Python-urllib/3.6”,指明请求是由urllib发送的。

所以遇到一些验证User-Agent的网站时,我们需要自定义Headers,而这需要借助于urllib.request中的Request对象。

from urllib import request​url = '/get'headers = {'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36'}​# 需要使用url和headers生成一个Request对象,然后将其传入urlopen方法中req = request.Request(url, headers=headers)resp = request.urlopen(req)print(resp.read().decode())

Request对象

如上所示,urlopen()方法中不止可以传入字符串格式的url,也可以传入一个Request对象来扩展功能,Request对象如下所示。

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

构造Request对象必须传入url参数,data数据和headers都是可选的。

最后,Request方法可以使用method参数来自由选择请求的方法,如PUT,DELETE等等,默认为GET。

添加Cookie

为了在请求时能带上Cookie信息,我们需要重新构造一个opener。

使用request.build_opener方法来进行构造opener,将我们想要传递的cookie配置到opener中,然后使用这个opener的open方法来发起请求。

from http import cookiejarfrom urllib import request​url = '/cookies'# 创建一个cookiejar对象cookie = cookiejar.CookieJar()# 使用HTTPCookieProcessor创建cookie处理器cookies = request.HTTPCookieProcessor(cookie)# 并以它为参数创建Opener对象opener = request.build_opener(cookies)# 使用这个opener来发起请求resp = opener.open(url)print(resp.read().decode())

或者也可以把这个生成的opener使用install_opener方法来设置为全局的。

则之后使用urlopen方法发起请求时,都会带上这个cookie。

# 将这个opener设置为全局的openerrequest.install_opener(opener)resp = request.urlopen(url)

设置Proxy代理

使用爬虫来爬取数据的时候,常常需要使用代理来隐藏我们的真实IP。

from urllib import request​url = '/ip'proxy = {'http':'50.233.137.33:80','https':'50.233.137.33:80'}# 创建代理处理器proxies = request.ProxyHandler(proxy)# 创建opener对象opener = request.build_opener(proxies)​resp = opener.open(url)print(resp.read().decode())

下载数据到本地

在我们进行网络请求时常常需要保存图片或音频等数据到本地,一种方法是使用python的文件操作,将read()获取的数据保存到文件中。

而urllib提供了一个urlretrieve()方法,可以简单的直接将请求获取的数据保存成文件。(对于做前端开发的来说和需要爬虫的人来说是个绝好的东西)

urlretrieve()方法传入两个参数,第一个是url字符串,第二个是文件保存的地址以及文件名

from urllib import request​url = '/'request.urlretrieve(url, 'python.html')

urllib.response

在使用urlopen()方法或者opener的open()方法发起请求后,获得的结果是一个response对象。

这个对象有一些方法和属性,可以让我们对请求返回的结果进行一些处理。

read()

获取响应返回的数据,只能使用一次。

getcode()

获取服务器返回的状态码。

getheaders()

获取返回响应的响应报头。

geturl()

获取访问的url。

res = request.urlopen('/')getData = res.getcode()print(getData) #200print(res.getheaders()) #客户端请求头print(res.geturl()) # /error/403#美团的反爬直接返回了403

urllib.parse

urllib.parse是urllib中用来解析各种数据格式的模块。

urllib.parse.quote

在url中,是只能使用ASCII中包含的字符的,也就是说,ASCII不包含的特殊字符,以及中文等字符都是不可以在url中使用的。而我们有时候又有将中文字符加入到url中的需求,例如百度的搜索地址:

/s?wd=南北

?之后的wd参数,则是我们搜索的关键词。那么我们实现的方法就是将特殊字符进行url编码,转换成可以url可以传输的格式,urllib中可以使用quote()方法来实现这个功能。

from urllib import parsekeyword = '南北'parse.quote(keyword)>>>'%E5%8D%97%E5%8C%97'

如果需要将编码后的数据转换回来,可以使用unquote()方法。

>>> parse.unquote('%E5%8D%97%E5%8C%97')'南北'

urllib.parse.urlencode

在访问url时,我们常常需要传递很多的url参数,而如果用字符串的方法去拼接url的话,会比较麻烦,所以urllib中提供了urlencode这个方法来拼接url参数。

>>> from urllib import parse>>> params = {'wd': '南北', 'code': '1', 'height': '188'}>>> parse.urlencode(params)'wd=%E5%8D%97%E5%8C%97&code=1&height=188'

urllib.error

在urllib中主要设置了两个异常,一个是URLError,一个是HTTPError,HTTPError是URLError的子类。

HTTPError还包含了三个属性:

code:请求的状态码

reason:错误的原因

headers:响应的报头

4、urllib3

Urllib3是一个功能强大,条理清晰,用于HTTP客户端的Python库。许多Python的原生系统已经开始使用urllib3。Urllib3提供了很多python标准库urllib里所没有的重要特性:

1、线程安全

2、连接池

3、客户端SSL/TLS验证

4、文件分部编码上传

5、协助处理重复请求和HTTP重定位

6、支持压缩编码

7、支持HTTP和SOCKS代理

urllib是一个第三方库,需要使用pip安装

pip install urllib3

使用

import urllib3 # urllib3主要使用连接池进行网络请求的访问,所以访问之前我们需要创建一个连接池对象http = urllib3.PoolManager()r = http.request('GET','/')print(r.status) #得到状态码print(r.data.decode('utf-8')) #同样需要进行转码,不然就是bytes码

设置headers

headers={'X-Something': 'value'}resp = http.request('GET', '/headers', headers=headers)

设置url参数

对于GET等没有请求正文的请求方法,可以简单的通过设置fields参数来设置url参数。

fields = {'arg': 'value'}resp = http.request('GET', '/get', fields=fields)

如果使用的是POST等方法,则会将fields作为请求的请求正文发送。

所以,如果你的POST请求是需要url参数的话,那么需要自己对url进行拼接。

fields = {'arg': 'value'}resp = http.request('POST', '/get', fields=fields)

>>> import urllib3>>> proxy = urllib3.ProxyManager('http://50.233.137.33:80', headers={'connection': 'keep-alive'})>>> resp = proxy.request('get', '/ip')>>> resp.status200>>> resp.datab'{"origin":"50.233.136.254"}\n'

注:

urllib3中没有直接设置cookies的方法和参数,只能将cookies设置到headers中

如果觉得《python发起网络请求模块【requests selenium urllib urllib3】》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。