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()

结果显示是以登陆状态在查看这篇文章。
1.4 基于urllib库使用代理请求
使用代理可以有效规避爬虫被封。

1 import urllib.request
2
3
4 def proxy_test():
5 url = 'http://myip.kkcha.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 proxy = {
11 'http': '180.137.232.101:53281'
12 }
13 # 创建代理Handler对象
14 proxy_handler = urllib.request.ProxyHandler(proxy)
15 # 以Handler对象为参数创建Opener对象
16 opener = urllib.request.build_opener(proxy_handler)
17 # 将Opener安装为全局
18 urllib.request.install_opener(opener)
19 response = urllib.request.urlopen(request)
20 page_source = response.read().decode('utf-8')
21 print(page_source)
22
23
24 if __name__ == '__main__':
25 proxy_test()

抓取到的页面应该显示代理IP,不知道什么原因,有时候能正常显示,有时候跳转到有道词典广告页!!!问题有待更进一步研究。
2. Python3 使用requsets库访问网络
2.1 基于requests库的GET请求
以GET方式请求http://httpbin.org测试网站。

1 import requests
2
3
4 def request_test():
5 url = 'http://httpbin.org/get'
6 response = requests.get(url)
7 print(type(response.text), response.text)
8 print(type(response.content), response.content)
9
10
11 if __name__ == '__main__':
12 request_test()

直接得到响应体。
1 <class 'str'> {"args":{},"headers":{"Accept":"*/*","Accept-Encoding":"gzip, deflate","Connection":"close","Host":"httpbin.org","User-Agent":"python-requests/2.18.4"},"origin":"121.61.132.191","url":"http://httpbin.org/get"}
2
3 <class 'bytes'> b'{"args":{},"headers":{"Accept":"*/*","Accept-Encoding":"gzip, deflate","Connection":"close","Host":"httpbin.org","User-Agent":"python-requests/2.18.4"},"origin":"121.61.132.191","url":"http://httpbin.org/get"}\n
在GET方法中传递参数的三种方式:
- 将字典形式的参数用urllib.parse.urlencode()函数编码成url参数:
1 import urllib.parse
2
3 if __name__ == '__main__':
4 base_url = 'http://httpbin.org/'
5 params = {
6 'key1': 'value1',
7 'key2': 'value2'
8 }
9 full_url = base_url + urllib.parse.urlencode(params)
10 print(full_url)1 http://httpbin.org/key1=value1&key2=value2
- 直接在urllib.request.get()函数中使用params参数:
1 import requests
2
3 if __name__ == '__main__':
4 payload = {
5 'key1': 'value1',
6 'key2': 'value2'
7 }
8 response = requests.get('http://httpbin.org/get', params=payload)
9 print(response.url)1 http://httpbin.org/key1=value1&key2=value2
- url直接包含参数:
1 http://httpbin.org/get?key2=value2&key1=value1
2.2 基于requests库的POST请求,并用session保持会话
登陆ChinaUnix论坛,获取首页源码,然后访问一个文章。首先不使用Session看一下什么效果:

1 import requests
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 response = requests.post(url=url, data=data, headers=headers)
15 page_source = response.text
16 print(response.status_code)
17 print(page_source)
18
19 url1 = 'http://bbs.chinaunix.net/thread-4263876-1-1.html'
20 response1 = requests.get(url=url1, headers=headers)
21 page_source1 = response1.text
22 print(response1.status_code)
23 print(page_source1)
24
25
26 if __name__ == '__main__':
27 get_page()

结果显示访问其它文章时为游客模式。接下来用session来维持会话看一下效果:

1 import requests
2
3
4 def get_page():
5 url = 'http://bbs.chinaunix.net/member.php?mod=logging&action=login&loginsubmit=yes&loginhash=LcN2z'
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 data = {
10 'username': 'StrivePy',
11 'password': 'XXX'
12 }
13 session = requests.session()
14 response = session.post(url=url, data=data, headers=headers)
15 page_source = response.text
16 print(response.status_code)
17 print(page_source)
18
19 url1 = 'http://bbs.chinaunix.net/thread-4263876-1-1.html'
20 response1 = session.get(url=url1, headers=headers)
21 page_source1 = response1.text
22 print(response1.status_code)
23 print(page_source1)
24
25
26 if __name__ == '__main__':
27 get_page()

结果显示访问其它文章时,显示为登陆状态,会话保持住了。使用session的效果类似于urllib库临时使用opener或者将opener安装为全局的效果。
2.3 基于requests库使用代理请求
在requests库中使用代理:

1 import requests
2
3
4 def proxy_test():
5 url = 'http://myip.kkcha.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 proxy = {
10 'https': '61.135.217.7: 80'
11 }
12 response = requests.get(url=url, headers=headers, proxies=proxy)
13 print(response.text)
14
15
16 if __name__ == '__main__':
17 proxy_test()

这个请求到的代码显示IP还是本地的网络IP,代理没起作用,具体原因有待研究。
urllib和requests库的更多相关文章
- Python使用urllib,urllib3,requests库+beautifulsoup爬取网页
Python使用urllib/urllib3/requests库+beautifulsoup爬取网页 urllib urllib3 requests 笔者在爬取时遇到的问题 1.结果不全 2.'抓取失 ...
- 从0开始学爬虫10之urllib和requests库与github/api的交互
urllib库的使用 # coding=utf-8 import urllib2 import urllib # htpbin模拟的环境 URL_IP="http://10.11.0.215 ...
- urllib、requests库整理
- Python3 urllib库和requests库
1. Python3 使用urllib库请求网络 1.1 基于urllib库的GET请求 请求百度首页www.baidu.com ,不添加请求头信息: import urllib.requests d ...
- requests库和urllib包对比
python中有多种库可以用来处理http请求,比如python的原生库:urllib包.requests类库.urllib和urllib2是相互独立的模块,python3.0以上把urllib和ur ...
- 【Python爬虫】HTTP基础和urllib库、requests库的使用
引言: 一个网络爬虫的编写主要可以分为三个部分: 1.获取网页 2.提取信息 3.分析信息 本文主要介绍第一部分,如何用Python内置的库urllib和第三方库requests库来完成网页的获取.阅 ...
- Requests库上传文件时UnicodeDecodeError: 'ascii' codec can't decode byte错误解析
在使用Request上传文件的时候碰到如下错误提示: 2013-12-20 20:51:09,235 __main__ ERROR 'ascii' codec can't decode byte 0x ...
- 【Python爬虫实战--1】深入理解urllib;urllib2;requests
摘自:http://1oscar.github.io/blog/2015/07/05/%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3urllib;urllib2;reques ...
- python WEB接口自动化测试之requests库详解
由于web接口自动化测试需要用到python的第三方库--requests库,运用requests库可以模拟发送http请求,再结合unittest测试框架,就能完成web接口自动化测试. 所以笔者今 ...
随机推荐
- NCBI之gene系列
1.基因系列中的data索引 2.基因ID之间的转换 对于生信,依托于别人的工具不如自己动手,由于研究发表的滞后性,往往很多工具提供的转换并不是最新的,况且开发者水平也参差不齐,理解原理才能让你来去自 ...
- Dubbo -- Simple Monitor
一.简介 dubbo-monitor-simple是dubbo提供的简单监控中心,可以用来显示接口暴露,注册情况,也可以看接口的调用明细,调用时间等. Simple Monitor挂掉不会影响到Con ...
- php支付宝接口 的使用
下载地址(java/php都有) https://doc.open.alipay.com/doc2/detail?treeId=66&articleId=103571&docType= ...
- Camstar :新加的modeling对象没有在 modeling的下拉框中显示
解决: 对象的maint 的 advance option client ui 要打上勾.
- python--第一天总结
[变量]1.变量定义的规则: 变量名只能是 字母.数字或下划线的任意组合 变量名的第一个字符不能是数字 以下关键字不能声明为变量名 ['and', 'as', 'assert', ' ...
- Python os.getcwd()
Python os.getcwd() 方法 Python OS 文件/目录方法 概述 os.getcwd() 方法用于返回当前工作目录. 语法 getcwd()方法语法格式如下: os.getcwd ...
- Application的特点
1.生命周期长.(内存泄漏) 2.单实例(一个进程就只有一个Application的实例对象) 3.onCreate的方法,可以认为一个应用程序的入口,做一些初始化的事情 4.不能自己new出 App ...
- Appium+python自动化1-环境搭建
一.前言 appium可以说是做app最火的一个自动化框架,它的主要优势是支持android和ios,另外脚本语言也是支持java和Python.小编擅长Python,所以接下来的教程是appium+ ...
- unity 3d音效如何设置?,近大远小
请问怎么将导入的音频文件设置为“3D Sound”?这是我导入的音频文件: 现在3D音效的设置不在导入音效文件的地方,而是在AudioSource的SpatialBlend属性,0表示2D,1表示3D ...
- windows+nginx+tomcat实现集群负载均衡(生产环境必读)
概念理解(原文链接) 集群:多个tomcat服务器运行同一个web服务就能称之为集群 负载均衡:apache按照一定方式将不同的客户端访问分配到不同的tomcat服务器 简单负载均衡实现: 网上参考了 ...