urllib.request库的基本使用
urllib2库的基本使用
所谓网页抓取,就是把URL地址中指定的网络资源从网络流中读取出来,保存到本地。 在Python中有很多库可以用来抓取网页,我们先学习urllib2。
urllib2 是 Python2.7 自带的模块(不需要下载,导入即可使用)
urllib2 官方文档:https://docs.python.org/2/library/urllib2.html
urllib2 源码:https://hg.python.org/cpython/file/2.7/Lib/urllib2.py
urllib2 在 python3.x 中被改为urllib.request
Request
如果需要执行更复杂的操作,比如增加HTTP报头,必须创建一个 Request 实例来作为urlopen()的参数;而需要访问的url地址则作为 Request 实例的参数。
1 from urllib import request 2 3 response=request.urlopen('http://www.baidu.com/') 4 print(response.read()) 5 6 header={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.87 Safari/537.36"} 7 a=request.Request('http://www.baidu.com/',headers=header) 8 response=request.urlopen(a) 9 print(response.read()) 10 print(response.getcode()) # 返回 HTTP的响应码,成功返回200,4服务器页面出错,5服务器问题 11 print(response.geturl()) # 返回 返回实际数据的实际URL,防止重定向问题 12 print(response.info()) # 返回 服务器响应的HTTP报头
新建Request实例,除了必须要有 url 参数之外,还可以设置另外两个参数:
data(默认空):是伴随 url 提交的数据(比如要post的数据),同时 HTTP 请求将从 "GET"方式 改为 "POST"方式。
headers(默认空):是一个字典,包含了需要发送的HTTP报头的键值对。
这两个参数下面会说到。
User-Agent
但是这样直接用urllib2给一个网站发送请求的话,确实略有些唐突了,就好比,人家每家都有门,你以一个路人的身份直接闯进去显然不是很礼貌。而且有一些站点不喜欢被程序(非人为访问)访问,有可能会拒绝你的访问请求。
但是如果我们用一个合法的身份去请求别人网站,显然人家就是欢迎的,所以我们就应该给我们的这个代码加上一个身份,就是所谓的User-Agent头。
- 浏览器 就是互联网世界上公认被允许的身份,如果我们希望我们的爬虫程序更像一个真实用户,那我们第一步,就是需要伪装成一个被公认的浏览器。用不同的浏览器在发送请求的时候,会有不同的User-Agent头。 urllib2默认的User-Agent头为:
Python-urllib/x.y(x和y是Python主版本和次版本号,例如 Python-urllib/2.7)
添加更多的Header信息
在 HTTP Request 中加入特定的 Header,来构造一个完整的HTTP请求消息。
可以通过调用
Request.add_header()添加/修改一个特定的header 也可以通过调用Request.get_header()来查看已有的header。
- 添加一个特定的header
1 from urllib import request 2 3 response=request.urlopen('http://www.baidu.com/') 4 print(response.read()) 5 6 header={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.87 Safari/537.36"} 7 a=request.Request('http://www.baidu.com/',headers=header) 8 response=request.urlopen(a) 9 print(response.read()) 10 11 a.add_header('Connection','keep-alive') 12 print(a.get_header('Connection'))
- 随机添加/修改User-Agent
1 from urllib import request 2 import random 3 4 ua_list = [ 5 "Mozilla/5.0 (Windows NT 6.1; ) Apple.... ", 6 "Mozilla/5.0 (X11; CrOS i686 2268.111.0)... ", 7 "Mozilla/5.0 (Macintosh; U; PPC Mac OS X.... ", 8 "Mozilla/5.0 (Macintosh; Intel Mac OS... " 9 ] 10 11 user_agent=random.choice(ua_list) 12 b=request.Request('http://www.baidu.com/') 13 b.add_header('User-Agent',user_agent) #可以通过调用Request.add_header() 添加/修改一个特定的header 14 request.urlopen(b) 15 print(b.get_header('User-agent')) #查看已有的header。 第一个字母大写,后面的全部小写
posted on 2020-02-25 21:10 cherry_ning 阅读(522) 评论(0) 收藏 举报
浙公网安备 33010602011771号