1 ## urllib2的使用 ##
(1) urllib2请求返回网页
示例1:测试使用该模块打开百度的首页
# -*- coding: UTF-8 -*-
import urllib2
import os
import time
import platform
def clear():
'''该函数用来清屏幕'''
print(u'内容较多,显示3秒后翻页')
time.sleep(3) # 程序延时3秒
OS = platform.system() # 获得系统的详细信息
if (OS == u'Windouws'):
os.system('cls')
else:
os.system('clear')
def linkBaidu():
url = 'http://www.baidu.com'
try:
response = urllib2.urlopen(url, timeout=3)
except urllib2.URLError:
print(u'网络地址错误')
exit()
with open(u'baidu.txt','w') as fp:
fp.write(response.read())
print (u'获取URL信息,response.geturl() \n: %s' %response.geturl())
print (u'获取返回代码,response.getcode() \n: %s' %response.getcode())
print (u'获取返回信息,response.info() \n: %s' %response.info())
print (u'获取的网页内容已经存入到当前目录的baidu.txt中,请自行查看')
# if __name__ == '__main__':
# linkBaidu()
# 直接创建一个实例运行
link = linkBaidu()
获得的结果如下所示:
获取URL信息,response.geturl()
: http://www.baidu.com
获取返回代码,response.getcode()
: 200
获取返回信息,response.info()
: Date: Sat, 16 Sep 2017 13:08:36 GMT
Content-Type: text/html; charset=utf-8
Transfer-Encoding: chunked
Connection: Close
Vary: Accept-Encoding
Set-Cookie: BAIDUID=D6F2E57DFB483FD5BB510439CC6C29A1:FG=1; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Set-Cookie: BIDUPSID=D6F2E57DFB483FD5BB510439CC6C29A1; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Set-Cookie: PSTM=1505567316; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Set-Cookie: BDSVRTM=0; path=/
Set-Cookie: BD_HOME=0; path=/
Set-Cookie: H_PS_PSSID=1444_21101_18560_17001_20930; path=/; domain=.baidu.com
P3P: CP=" OTI DSP COR IVA OUR IND COM "
Cache-Control: private
Cxy_all: baidu+64930d73b4dbc83b2181952b94cde62d
Expires: Sat, 16 Sep 2017 13:07:38 GMT
X-Powered-By: HPHP
Server: BWS/1.1
X-UA-Compatible: IE=Edge,chrome=1
BDPAGETYPE: 1
BDQID: 0x8639b84b00024905
BDUSERID: 0
获取的网页内容已经存入到当前目录的baidu.txt中,请自行查看
Process finished with exit code 0
(2)urllib2使用代理访问网页
示例2:使用爬虫时,有点 网址会拒绝ip的直接访问,所以需要使用代理,免费的代理可以在在网上搜索,我是从一个免费的ip代理网址获取的代理49.72.154.205:8118。
# -*- coding: UTF-8 -*-
import urllib2
import re
import sys
# 使用代理访问网页
def testArgument():
'''测试输入参数,只要一个参数'''
# sys.argv[]是获取命令行参数,sys.argv[0]表示代码本身文件路径,所以参数从1开始
if len(sys.argv) !=2:
print(u'只需要一个参数')
tipUse()
exit()
else:
TP = TestProxy(sys.argv[1])
def tipUse():
'''显示提示信息'''
print(u'该程序只能输入一个参数,其必须是一个可用的proxy')
print(u'usage: python testUrllib2WithProxy.py http://1.2.3.4:5')
print(u'usage: python testUrllib2WithProxy.py https://1.2.3.4:5')
class TestProxy(object):
'''这个类的作用是测试proxy是否有效'''
def __init__(self,proxy):
self.proxy = proxy
self.checkProxyFormat(self.proxy) #检查格式
self.url = 'http://www.baidu.com'
self.timeout = 5
self.flagWord = '百度' # 在网页返回的数据中查找这个关键词
self.useProxy(self.proxy)
def checkProxyFormat(self,proxy):
try:
proxyMatch = re.compile('http[s]?://[\d]{1,3}\.[\d]{1,3}\.[\d]{1,3}\.[\d]{1,3}:[\d]{1,5}$')
re.search(proxyMatch,proxy).group()
except AttributeError: # 尝试访问未知的对象属性
tipUse()
exit()
flag = 1
proxy = proxy.replace('//','')
try:
protocal = proxy.split(':')[0]
ip = proxy.split(':')[1]
port = proxy.split(':')[2]
except IndexError:
print(u'下标出界')
tipUse()
exit()
flag = flag and len(proxy.split(':')) == 3 and len(ip.split('.')) == 4
flag = ip.split('.')[0] in map(str,xrange(1,256))and flag
flag = ip.split('.')[1] in map(str,xrange(256))and flag
flag = ip.split('.')[2] in map(str,xrange(256))and flag
flag = ip.split('.')[3] in map(str,xrange(1, 255))and flag
flag = protocal in [u'http',u'https'] and flag
flag = port in map(str,range(1,65535)) and flag
'''这里是在检查proxy的格式'''
if flag:
print(u'输入的http代理服务器符合标准')
else:
tipUse()
exit()
def useProxy(self,proxy):
'''利用代理服务器,查找关键词'''
protocal = proxy.split('//')[0].replace(':','')
ip = proxy.split('//')[1]
opener = urllib2.build_opener(urllib2.ProxyHandler({protocal:ip}))
urllib2.install_opener(opener)
try:
response = urllib2.urlopen(self.url,timeout=self.timeout)
except:
print(u'连接出错,退出程序')
exit()
str = response.read()
if re.search(self.flagWord,str): #查找关键词self.flagWord,即百度
print (u'已取得特征词,该代理可用')
else:
print(u'该代理不可用')
if __name__ == '__main__':
testArgument()
结果如下所示
J:\Learn01\python\t01\studyM01\M04\Four>python Test002.py http://49.72.154.205:8118
输入的http代理服务器符合标准
已取得特征词,该代理可用
(3)修改header
网站是通过浏览器发送来的User-Agent的值,来确定浏览器的身份,用urllib2来创建一个请求对象,并给他一个包含头数据的字典,修改User-Agent欺骗网址。
准备工作:userAgent.py,一个存储常见的user-Agent,方便以后使用。
# -*- coding: UTF-8 -*-
import urllib2
import studyM01.M04.Four.Test003.UserAgents
'''userAgents.py是一个自定义的模块'''
class Urllib2ModifyHeader(object):
def __init__(self):
# 使用PC+IE的user-agent,注意,括号内无逗号
PIUA = studyM01.M04.Four.Test003.UserAgents.pcUserAgent.get('IE 9.0')
# 这个是mobile+UC的user-agent
MUUA = studyM01.M04.Four.Test003.UserAgents.mobileUserAgent.get('UC standard')
self.url = 'http://fanyi.youdao.com'
self.useUserAgent(PIUA, 1)
self.useUserAgent(MUUA, 2)
def useUserAgent(self, userAgent, name):
request = urllib2.Request(self.url)
request.add_header(userAgent.split(':')[0], userAgent.split(':')[1])
response = urllib2.urlopen(request)
fileName = str(name) + '.html'
with open(fileName, 'a')as fp:
fp.write('%s\n\n' %userAgent)
fp.write(response.read())
if __name__== '__main__':
um = Urllib2ModifyHeader()
获得的结果是两个html,分别运行后,得到不同的有道翻译界面。