urllib2 之opener

urllib2.urlopen()函数不支持验证、cookie或者其它HTTP高级功能。要支持这些功能,必须使用build_opener()函数创建自定义Opener对象。

build_opener ()返回的对象具有open()方法,与urlopen()函数的功能相同。

 

如果要修改http报头,可以用:

import urllib2
opener = urllib2.build_opener()
opener.addheaders = [('User-agent', 'Mozilla/5.0')]
opener.open('http://www.example.com/')

2. install_opener(opener)

安装不同的opener对象作为urlopen()使用的全局opener。

3. 密码验证(HTTPBasicAuthHandler)

HTTPBasicAuthHandler()处理程序可用add_password()来设置密码。

 

复制代码代码如下:

 


h.add_password(realm,uri,user,passwd)

 

realm是与验证相关联的名称或描述信息,取决于远程服务器。uri是基URL。user和passwd分别指定用户名和密码。

 

复制代码代码如下:

 


import urllib2
auth=urllib2.HTTPBasicAuthHandler()
auth.add_password('Administrator','http://www.example.com','Dave','123456')
opener=urllib2.build_opener(auth)
u=opener.open('http://www.example.com/evilplan.html')

 

4. Cookie处理(HTTPCookieProcessor)

 

复制代码代码如下:

 


import urllib2,cookielib
cookie=cookielib.CookieJar()
cookiehand=urllib2.HTTPCookieProcessor(cookie)
opener=urllib2.build_opener(cookiehand)

 

5.代理(ProxyHandler)

ProxyHandler(proxies)参数proxies是一个字典,将协议名称(http,ftp)等映射到相应代理服务器的URL。

 

复制代码代码如下:

 


proxy=ProxyHandler({'http':'http://someproxy.com:8080'})
auth=HTTPBasicAuthHandler()
auth.add_password()
opener=build_opener(auth,proxy)

 

也可以在urlopen中使用代理

 

复制代码代码如下:

 


import urllib2   
proxy = 'http://%s:%s@%s' % ('userName', 'password', 'proxy')   
inforMation = urllib2.urlopen("http://www.example.com", proxies={'http':proxy})   

转自http://www.jb51.net/article/46495.htm

 

 

 

 

 

 

使用了python3的urllib模块,开始使用了简单的urllib.request.urlopen()函数,结果发现行不通,csdn设置了简单的检查选项,需要python模拟浏览器进行访问才行,简单的很,那就模仿一个好啦,使用urllib.request.build_opener()就可以进行模拟啦,添加一个访问头就可以啦

 

 

但是呢,访问太频繁有可能会造成服务器拒绝访问,那么就稍微等等好啦,使用time模块中的sleep()函数即可。还有一个小问题,当服务器拒绝的时候,python会当成错误,从而终止了程序,这样就不好玩了,一点都不自动化,解决这个问题也蛮简单,刚才看书才看到try…except…语法,这样把出现的错误都放到except语句里面不就OK了么,经过本人测试,一般会出现下面两个错误urllib.error.HTTPError和urllib.error.URLError,那这两个错误都弄到except里面就可以啦,哈哈

 

 

于是简单的刷一个页面的版本出现啦,代码如下:

 


 

__author__ = 'MrChen'

import urllib.request
import time

#使用build_opener()是为了让python程序模仿浏览器进行访问
opener = urllib.request.build_opener()
opener.addheaders = [('User-agent', 'Mozilla/5.0')]

#专刷某个页面
print('开始刷了哦:')
tempUrl = 'http://blog.csdn.net/calling_wisdom/article/details/40900815'
for j in range(200):
    try :
        opener.open(tempUrl)
        print('%d %s' % (j , tempUrl))
    except urllib.error.HTTPError:
        print('urllib.error.HTTPError')
        time.sleep(1)
    except urllib.error.URLError:
        print('urllib.error.URLError')
        time.sleep(1)
    time.sleep(0.1)



 

 

上面这个版本圆满完成了刷一个页面的任务,还蛮好用的,但是呢,如果我要把我所有的博客都刷个遍呢,一个一个地刷是不是太慢了呢,鄙人七八篇博客还勉强可以接受,但是如果以后七八十篇呢……想想就头疼,还是继续想办法吧

 

 

鉴于目前本人的所有博客都在博客主页目录的第一页中,所以直接查看博客目录,然后把每篇博客的网址都提取出来不久OK了么,嗯,说干就干

 

 

简单列一下思路:

 

1, 先抓取博客目录页的网址内容,然后使用re模块进行查找,找到每篇博客的地址(实际情况是这样的,里面的网址都是半截半截的,类似这样的/calling_wisdom/article/details/........,一会把前面的部分加上就可以了)

 

2, 把里面重复的网页过滤掉,这个也简单,使用set()就可以了

 

3, 把抓取到的网址合并成可以直接进行访问的网址

 

4, 使用一下刚学的BeautifulSoup解析网页的标题,这样就可以知道刷的是哪篇博客了(在这里继续夸一夸BeautifulSoup,超级好用,一下就把我想要的内容提取出来了)

 

5, 准备完毕,刷起来!每个页面给大爷刷200遍先!让爷装B让爷飞!

 

 

代码如下:(注释写的很到位了吧,不用再解释什么吧,最讨厌写代码没注释的)

 

__author__ = 'MrChen'

import urllib.request
import re
import time
from bs4 import BeautifulSoup

p = re.compile('/calling_wisdom/article/details/........')

#自己的博客主页
url = "http://blog.csdn.net/calling_wisdom" 

#使用build_opener()是为了让python程序模仿浏览器进行访问
opener = urllib.request.build_opener()
opener.addheaders = [('User-agent', 'Mozilla/5.0')]

html = opener.open(url).read().decode('utf-8')

allfinds = p.findall(html)
#print(allfinds)

urlBase = "http://blog.csdn.net"#需要将网址合并的部分
#页面中的网址有重复的,需要使用set进行去重复
mypages = list(set(allfinds))
for i in range(len(mypages)):
    mypages[i] = urlBase+mypages[i]

print('要刷的网页有:')
for index , page in enumerate(mypages) :
    print(str(index), page)

#设置每个网页要刷的次数
brushNum = 200

#所有的页面都刷
print('下面开始刷了哦:')
for index , page in enumerate(mypages) :
    for j in range(brushNum):
        try :
            pageContent = opener.open(page).read().decode('utf-8')
            #使用BeautifulSoup解析每篇博客的标题
            soup = BeautifulSoup(pageContent)
            blogTitle = str(soup.title.string)
            blogTitle = blogTitle[0:blogTitle.find('-')]
            print(str(j) , blogTitle) 
            
        except urllib.error.HTTPError:
            print('urllib.error.HTTPError')
            time.sleep(3)#出现错误,停几秒先
            
        except urllib.error.URLError:
            print('urllib.error.URLError')
            time.sleep(3)#出现错误,停几秒先
        time.sleep(0.5)#正常停顿,以免服务器拒绝访问



 

 


 



本文章由软件制作网发布,转载勿必保留网站链接地址 http://www.wl566.com/biancheng/152860.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值