Python urllib库和requests库
Posted StrivePy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python urllib库和requests库相关的知识,希望对你有一定的参考价值。
1. Python3 使用urllib库请求网络
1.1 基于urllib库的GET请求
请求百度首页www.baidu.com ,不添加请求头信息:
1 import urllib.requests 2 3 4 def get_page(): 5 url = ‘http://www.baidu.com/‘ 6 res = urllib.request.urlopen(url=url) 7 page_source = res.read().decode(‘utf-8‘) 8 print(page_source) 9 10 11 if __name__ == ‘__main__‘: 12 get_page()
输出显示百度首页的源码。但是有的网站进行了反爬虫设置,上述代码可能会返回一个40X之类的响应码,因为该网站识别出了是爬虫在访问网站,这时需要伪装一下爬虫,让爬虫模拟用户行为,给爬虫设置headers(User-Agent)属性,模拟浏览器请求网站。
1.2 使用User-Agent伪装后请求网站
由于urllib.request.urlopen() 函数不接受headers参数,所以需要构建一个urllib.request.Request对象来实现请求头的设置:
1 import urllib.request 2 3 4 def get_page(): 5 url = ‘http://www.baidu.com‘ 6 headers = { 7 ‘User-Agent‘: ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36‘ 8 } 9 request = urllib.request.Request(url=url, headers=headers) 10 res = urllib.request.urlopen(request) 11 page_source = res.read().decode(‘utf-8‘) 12 print(page_source) 13 14 15 if __name__ == ‘__main__‘: 16 get_page()
添加headers参数,来模拟浏览器的行为。
1.3 基于urllib库的POST请求,并用Cookie保持会话
登陆ChinaUnix论坛,获取首页源码,然后访问一个文章。首先不使用Cookie看一下什么效果:
1 import urllib.request 2 import urllib.parse 3 4 5 def get_page(): 6 url = ‘http://bbs.chinaunix.net/member.php?mod=logging&action=login&loginsubmit=yes&loginhash=LcN2z‘ 7 headers = { 8 ‘User-Agent‘: ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36‘ 9 } 10 data = { 11 ‘username‘: ‘StrivePy‘, 12 ‘password‘: ‘XXX‘ 13 } 14 postdata = urllib.parse.urlencode(data).encode(‘utf-8‘) 15 req = urllib.request.Request(url=url, data=postdata, headers=headers) 16 res = urllib.request.urlopen(req) 17 page_source = res.read().decode(‘gbk‘) 18 print(page_source) 19 20 url1 = ‘http://bbs.chinaunix.net/thread-4263876-1-1.html‘ 21 res1 = urllib.request.urlopen(url=url1) 22 page_source1 = res1.read().decode(‘gbk‘) 23 print(page_source1) 24 25 26 if __name__ == ‘__main__‘: 27 get_page()
搜索源码中是否能看见用户名StrivePy,发现登陆成功,但是再请求其它文章时,显示为游客状态,会话状态没有保持。现在使用Cookie看一下效果:
1 import urllib.request 2 import urllib.parse 3 import http.cookiejar 4 5 6 def get_page(): 7 url = ‘http://bbs.chinaunix.net/member.php?mod=logging&action=login&loginsubmit=yes&loginhash=LcN2z‘ 8 headers = { 9 ‘User-Agent‘: ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36‘ 10 } 11 data = { 12 ‘username‘: ‘StrivePy‘, 13 ‘password‘: ‘XXX‘ 14 } 15 postdata = urllib.parse.urlencode(data).encode(‘utf-8‘) 16 req = urllib.request.Request(url=url, data=postdata, headers=headers) 17 # 创建CookieJar对象 18 cjar = http.cookiejar.CookieJar() 19 # 以CookieJar对象为参数创建Cookie 20 cookie = urllib.request.HTTPCookieProcessor(cjar) 21 # 以Cookie对象为参数创建Opener对象 22 opener = urllib.request.build_opener(cookie) 23 # 将Opener安装位全局,覆盖urlopen函数,也可以临时使用opener.open()函数 24 urllib.request.install_opener(opener) 25 res = urllib.request.urlopen(req) 26 page_source = res.read().decode(‘gbk‘) 27 print(page_source) 28 29 url1 = ‘http://bbs.chinaunix.net/thread-4263876-1-1.html‘ 30 res1 = urllib.request.urlopen(url=url1) 31 page_source1 = res1.read().decode(‘gbk‘) 32 print(page_source1) 33 34 35 if __name__ == ‘__main__‘: 36 get_page()
结果显示登陆成功后,再访问其它文章时,显示为登陆状态。若要将Cookie保存为文件待下次使用,可以使用MozillaCookieJar对象将Cookie保存为文件。
1 import urllib.request 2 import urllib.parse 3 import http.cookiejar 4 5 6 def get_page(): 7 url = ‘http://bbs.chinaunix.net/member.php?mod=logging&action=login&loginsubmit=yes&loginhash=LcN2z‘ 8 headers = { 9 ‘User-Agent‘: ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36‘ 10 } 11 data = { 12 ‘username‘: ‘StrivePy‘, 13 ‘password‘: ‘XXX‘ 14 } 15 postdata = urllib.parse.urlencode(data).encode(‘utf-8‘) 16 req = urllib.request.Request(url=url, data=postdata, headers=headers) 17 filename = ‘cookies.txt‘ 18 # 创建CookieJar对象 19 cjar = http.cookiejar.MozillaCookieJar(filename) 20 # 以CookieJar对象为参数创建Cookie 21 cookie = urllib.request.HTTPCookieProcessor(cjar) 22 # 以Cookie对象为参数创建Opener对象 23 opener = urllib.request.build_opener(cookie) 24 # 临时使用opener来请求 25 opener.open(req) 26 # 将cookie保存为文件 27 cjar.save(ignore_discard=True, ignore_expires=True)
会在当前工作目录生成一个名为cookies.txt的cookie文件,下次就可以不用登陆(如果cookie没有失效的话)直接读取这个文件来实现免登录访问。例如不进行登陆直接访问其中一篇文章(没登陆也可以访问,主要是看抬头是不是登陆状态):
1 import http.cookiejar 2 3 4 def get_page(): 5 url1 = ‘http://bbs.chinaunix.net/thread-4263876-1-1.html‘ 6 filename = ‘cookies.txt‘ 7 cjar = http.cookiejar.MozillaCookieJar(filename) 8 cjar.load(ignore_discard=True, ignore_expires=True) 9 cookie = urllib.request.HTTPCookieProcessor(cjar) 10 opener = urllib.request.build_opener(cookie) 11 res1 = opener.open(url1) 12 page_source1 = res1.read().decode(‘gbk‘) 13 print(page_source1) 14 15 16 if __name__ == ‘__main__‘: 17 get_page()
结果显示是以登陆状态在查看这篇文章。
以上是关于Python urllib库和requests库的主要内容,如果未能解决你的问题,请参考以下文章