Urllib Demo

使用Urllib爬取网页

将爬取到的网页以网页的形式保存在本地

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import urllib.request

# 爬取百度首页
file = urllib.request.urlopen("http://www.baidu.com")
# 将对应的网页内容读取出来
data = file.read()
#print(data)

# 以二进制写入的方式打开文件
fhandle = open("/Users/matianyao/Desktop/crawler.html", "wb")
# 写入对应的数据
fhandle.write(data)
# 关闭文件
fhandle.close()

直接将对应信息写入本地文件

1
2
3
4
5
6
import urllib.request

# 直接将网页写入本地文件
filename = urllib.request.urlretrieve("http://edu.51cto.com", filename="/Users/matianyao/Desktop/crawler.html")
# 清除urlretrieve执行所造成的缓存
urllib.request.urlcleanup()

其它常见用法

1
2
3
4
5
6
7
8
9
10
# 返回与当前环境有关的信息
file.info()
# 获取当前爬取网页的状态码
file.getcode()
# 获取当前所爬取的url地址
file.geturl()
# 对网址进行编码
urllib.request.quote("http://www.sina.com.cn")
# 对编码的网址进行解码
urllib.request.unquote("http%3A//www.sina.com.cn")

浏览器的模拟——Headers属性

有时候,无法爬取一些网页,会出现403错误,因为这些网页为了防止别人恶意采集其信息所以进行了一些反爬虫的设置。
可以设置一些Headers信息,模拟成浏览器去访问这些网站。

使用build_opener()修改报头

1
2
3
4
5
6
7
8
9
10
11
import urllib.request

url = "http://worldagnetwork.com/"
headers = ("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/604.4.7 (KHTML, like Gecko) Version/11.0.2 Safari/604.4.7")

# 创建自定义的opener对象
opener = urllib.request.build_opener()
# 设置对应的头信息
opener.addheaders = [headers]
# 打开对应的网址,再读取对应数据
data = opener.open(url).read()

使用add_header()添加报头

1
2
3
4
5
6
7
8
9
10
import urllib.request

url = "http://worldagnetwork.com/"

# 创建一个Request对象
req = urllib.request.Request(url)
# 添加对应的报头信息
req.add_header("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/604.4.7 (KHTML, like Gecko) Version/11.0.2 Safari/604.4.7")
# 打开对应网址并读取了网页内容
data = urllib.request.urlopen(req).read()

超时设置

有时候,访问一个网页,如果该网页长时间未响应,那么系统就会判断该网页超时了,即无法打开该网页。

1
2
3
4
5
6
7
8
9
10
import urllib.request

for i in range (1, 30):
try:
# 在爬取的时候设置超时异常的值
file = urllib.request.urlopen("http://yum.iqianyue.com", timeout=0.1)
data = file.read()
print(len(data))
except Exception as e:
print("ERROR-->" + str(e))

HTTP协议请求实战

GET请求实例分析

  1. 构建对应的url地址,该url地址包含GET请求的字段名和字段内容等信息,并且url地址满足GET请求的格式,即“http://网址?字段名1=字段内容1&字段名2=字段内容2”
  2. 以对应的url为参数,构建Request对象
  3. 通过urlopen()打开构建的Request对象
  4. 按需求进行后续的处理操作,比如读取网页的内容、将内容写入文件等
1
2
3
4
5
6
7
8
9
10
11
12
import urllib.request

key = "哈哈"
url = "http://www.baidu.com/s?wd="
key_code = urllib.request.quote(key)
url_all = url + key_code
req = urllib.request.Request(url_all)
data = urllib.request.urlopen(req).read()

fhandle = open("/Users/matianyao/Desktop/crawler.html", "wb")
fhandle.write(data)
fhandle.close()

POST请求实例分析

  1. 设置好url网址
  2. 构建表单数据,并使用urllib.parse.urlencode对数据进行编码处理
  3. 创建Request对象,参数包括url地址和要传递的数据
  4. 使用add_header()添加头信息,模拟浏览器进行爬取
  5. 使用urllib.request.urlopen()打开对应的Request对象,完成信息的传递
  6. 后续处理,比如读取网页内容、将内容写入文件等
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import urllib.request
import urllib.parse

url = "http://www.iqianyue.com/mypost/"
postdata = urllib.parse.urlencode({
"name": "ceo@iqianyue.com",
"pass": "aA123456"
}).encode("utf-8")
req = urllib.request.Request(url, postdata)
req.add_header("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/604.4.7 (KHTML, like Gecko) Version/11.0.2 Safari/604.4.7")
data = urllib.request.urlopen(req).read()

fhandle = open("/Users/matianyao/Desktop/crawler.html", "wb")
fhandle.write(data)
fhandle.close()

代理服务器的设置

有时使用同一个IP去爬取同一个网站上的网页,久了之后会被该网站服务器屏蔽。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import urllib.request

# 使用代理服务器来爬取某个url网页
def use_proxy(proxy_addr, url):
# 设置对应的代理服务器信息
proxy = urllib.request.ProxyHandler({"http": proxy_addr})
# 创建一个自定义的opener对象
opener = urllib.request.build_opener(proxy, urllib.request.HTTPHandler)
# 创建全局默认的opener对象
urllib.request.install_opener(opener)
# 打开对应网址爬取网页并读取
data = urllib.request.urlopen(url).read().decode("utf-8")
return data

proxy_addr = "61.135.217.7:80"
data = use_proxy(proxy_addr, "http://www.baidu.com")
print(len(data))

异常处理神器——URLError实战

一般来说,产生URLError的原因有如下几种可能:
1) 连接不上服务器
2) 远程url不存在
3) 无网络
4) 触发了HTTPError

HTTPError

1
2
3
4
5
6
7
8
import urllib.request
import urllib.error

try:
urllib.request.urlopen("http://worldagnetwork.com/")
except urllib.error.HTTPError as e:
print(e.code)
print(e.reason)

URLError

1
2
3
4
5
6
7
import urllib.request
import urllib.error

try:
urllib.request.urlopen("http://www.baidusss.net/")
except urllib.error.URLError as e:
print(e.reason)

整合改进

1
2
3
4
5
6
7
8
9
10
import urllib.request
import urllib.error

try:
urllib.request.urlopen("http://www.baidusss.com/")
except urllib.error.URLError as e:
if hasattr(e, "code"):
print(e.code)
if hasattr(e, "reason"):
print(e.reason)