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.txtcookie文件,下次就可以不用登陆(如果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库的主要内容,如果未能解决你的问题,请参考以下文章

requests库和urllib包对比

urllib的实现---请求响应and请求头处理

python2.x到python3.x函数变化

python urllib

用requests库和BeautifulSoup4库爬取新闻列表

requests和BeautifulSoup模块的使用