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响应对象。

对于响应对象读取的三种方式:

  1. file.read() 读取文件的全部内容
  2. file.readlines() 读取文件的全部内容,与read不同的是,readlines会把读取到的内容赋给一个列表变量。(推荐)
  3. 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))

 

posted @ 2019-05-18 16:03  learning_log  阅读(209)  评论(0编辑  收藏  举报