python-urllib
python-urllib快速上手
1 import urllib.request 2 3 url = 'http://www.baidu.com' 4 file = urllib.request.urlopen(url) 5 data = file.read() 6 dataline = file.readline() 7 datalines = file.readlines()
首先导入urllib.request模块
然后使用urllib.request.urlopen打开并爬取一个网页,此时返回的是<http.client.HTTPResponse object at 0x00000206F862C4A8>,一个HTTP响应对象。
对于响应对象读取的三种方式:
- file.read() 读取文件的全部内容
- file.readlines() 读取文件的全部内容,与read不同的是,readlines会把读取到的内容赋给一个列表变量。(推荐)
- file.readline() 读取文件的一行内容
如果希望返回与当前环境有关的信息,可以使用info()
file.info()
如果希望获取当前爬取网页的状态码,我们可以使用getcode()
file.getcode()
如果想要获取当前所爬取的URL地址,可以使用geturl()
file.geturl()
一般来说,URL标准中只会允许一部分ASCLL字符比如数字、字母、部分符号等,而其他的一些字符,比如汉字等,是不符合URL标准的。所以如果我们在URL中使用了一些其他不符合标准的字符就会出现问题,此时需要进行URL编码方可解决。
如果要进行编码,可以使用urllib.request.quote()进行
urllib.request.quote('http://www.baidu.com')
可以看到,编码结果是'http%3A//www.baidu.com'
相应的,有时需要对编码的网址进行解码。若要解码,可以使用urllib.request.unquote()
urllib.request.unquote('http%3A//www.baidu.com')
输出结果为'http://www.baidu.com'
除了这种方法之外,还可以使用urllib.request里面的urlretrieve()函数直接将对应信息写入本地文件。格式为:“urllib.request.urlretrieve(url,filename='本地文件地址')”
filename = urllib.request.urlretrieve('http://www.baidu.com','本地位置')
浏览器模拟——Headers属性
为了防止禁止爬虫访问,让爬虫模拟成浏览器
方法一:使用build_opener()修改报头
由于urlopen()不支持一些HTTP的高级功能,所以,我们如果要修改报头,可以使用urllib.request.build_opener()进行。
1 import urllib.request 2 url = '网址' 3 headers = ('User-Agent','...') 4 opener = urllib.request.build_opener() 5 opener.addheaders = [headers] 6 data = opener.open(url).read()
方法二:使用add_header()添加报头
可以使用urllib.request.Request()下的add_header()实现浏览器的模拟
import urllib.request url = 'http://blog.csdn.net/weiwei_pig/article/details/51178226' req = urllib.request.Request(url) req.add_header('User-Agent','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36') data = urllib.request.urlopen(req).read()
使用urllib.request.Request()返回的是<urllib.request.Request object at 0x000001730BE1EB70>,使用add.header为Request对象添加报头。
此时已经成功设置好报头,然后我们使用urlopen()打开Request对象即可打开对应网站,得到一个HTTP的响应对象。
超时设置
有的时候,我们访问一个网页,如果该网页长时间未响应,那么系统就会判断该网页超时了。既无法打开该网页。
有的时候,我们需要根据自己的需要来设置超时的时间值。
import urllib.request for i in range(1,100): try: file = urllib.request.urlopen('url',timeout=1) data = file.read() print(len(data)) except Exception as e: print('出现异常:'+str(e))
HTTP协议请求实战
代理服务器设置
可以从整理好的网址http://yum.iqianyue.com/proxy中找到很多代理服务器地址。
有了代理ip地址之后,我们就可以通过代理服务器来爬取网站内容了。
import urllib.request def use_proxy(proxy_addr,url): proxy = urllib.request.ProxyHandler({'http':proxy_addr}) opener = urllib.request.build_opener(proxy,urllib.request.HTTPHandler) urllib.request.install_opener(opener) data = urllib.request.urlopen(url).read().decode('utf-8') return data proxy_addr = '112.85.173.20:9999' url = 'http://www.baidu.com' data = use_proxy(proxy_addr,url) print(len(data))