urllib2的使用

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,分别运行后,得到不同的有道翻译界面。这里写图片描述
这里写图片描述

猜你喜欢

转载自blog.csdn.net/bhcgdh/article/details/78006581
今日推荐