Python用了快一年了,应用最广泛的场景是web快速开发,爬虫和自动化运维:写简单的网站,写自动发帖脚本,收发邮件,写简单的验证码识别脚
Python用了快一年了,应用最广泛的场景是web快速开发,爬虫和自动化运维:写简单的网站,写自动发帖脚本,收发邮件,写简单的验证码识别脚本。
爬虫在开发过程中也有很多复用过程。这里总结一下,以后可以省点事。
1、基本网页抓取
获取方法
导入URL lib 2 URL ' http://www . Baidu . com ' respons=URL lib 2 . urlopen(URL)print response . read()
过帐方法
import urlli import URL lib 2 URL=' http://abcde . com ' form={ ' name '' ABC '' password '' 1234 ' } form _ data=urllib . urlencode(form)request=urllib 2。Request(url,form _ data)response=URL lib 2 . URL open(request)print response . read()
2、使用代理IP
在开发爬虫的过程中,IP经常被阻塞,所以需要代理IP。
urllib2包中有一个ProxyHandler类,通过它可以设置访问网页的代理,如下面的代码片段所示:
导入urllib2proxy=urllib2。proxy handler({ ' http '' 127 . 0 . 0 . 1:8087 ' })opener=URL lib 2 . build _ opener(proxy)URL lib 2 . install _ opener(opener)response=URL lib 2 . URL open(' http://www . Baidu . com ')print response . read()
3、 cookie处理
Cookies是一些网站存储在用户本地终端上的数据(通常是加密的),目的是识别用户和跟踪会话。python提供了一个cookieslib模块来处理cookie。cookieslib模块的主要功能是提供可以存储cookie的对象,这样就可以和urllib2模块一起使用来访问Internet资源。
代码片段:
导入urllib2,cookielibcookie _ support=URL lib 2。HTTPCookieProcessor(cookielib。CookieJar())opener=URL lib 2 . build _ opener(cookie _ support)URL lib 2 . install _ opener(opener)content=URL lib 2 . URL open(' http://xxxx ')。阅读()
关键是CookieJar(),它用于管理HTTP cookie值,存储HTTP请求生成的cookie,并将cookie对象添加到传出的HTTP请求中。整个cookie存储在内存中,CookieJar实例垃圾回收后cookie会丢失,所有进程不需要单独操作。
手动添加cookie
cookie=' PHPSESSID=91 ruffqm 2329 bopnosfu 4 fvmu 7;km sign=55 D2 c12c 9 B1 e 3;KMUID=b 6 ejc 1 xswpq 9 o 756 axn bag=' request . add _ header(' Cookie 'Cookie)
4、伪装成浏览器
有些网站不喜欢爬虫的访问,所以都拒绝了对爬虫的请求。所以直接用urllib2访问网站经常会出现HTTP Error 403: Forbidden的情况。
特别注意一些头,服务器会检查这些头。
用户代理某些服务器或代理检查该值以确定请求是否由浏览器发起。
当Content-Type使用REST接口时,服务器将检查该值,以确定应该如何解析HTTP主体中的内容。
这可以通过修改http包中的头来实现。代码片段如下:
import URL lib 2 headers={ ' User-Agent '' Mozilla/5.0(Windows;u;Windows NT 6.1en-US;RV:1 . 9 . 1 . 6)Gecko/2009 12 01 Firefox/3 . 5 . 6 ' } request=URL lib 2。请求(URL=' http://my . oschina . net/jhao 104/blog?catalog=3463517 'headers=headers)打印urllib2.urlopen(request)。阅读()
5、页面解析
当然页面解析最厉害的还是正则表达式,不同网站不同用户不一样,不用我解释太多,附上两个比较好的网站:
正则表达式简介:http://www.cnblogs.com/huxi/archive/2010/07/04/1771073.html
正则表达式的在线测试:http://tool.oschina.net/regex/
其次是解析库。常用的有lxml和BeautifulSoup两种。对于这两者的使用,介绍两个比较好的网站:
lxml:http://my.oschina.net/jhao104/blog/639448
美丽的海岸:http://cuiqingcai.com/1319.html
对于这两个库,我的评价是都是HTML/XML处理库,Beautifulsoup是用python实现的,效率不高,但有实用功能,比如通过结果搜索获得一个HTML节点的源代码;LxmlC语言编码,高效,支持Xpath。
6、验证码的处理
对于一些简单的验证码,可以进行简单的识别。我只做过一些简单的验证码识别。但是有些反人类的验证码,比如12306,可以通过打码平台手工打码,当然是要收费的。
7、gzip压缩
你有没有遇到过一些网页?不管怎么转码,都是乱码。哈哈,那说明你不知道很多web服务都有发送压缩数据的能力,可以减少网络线路上传输的大量数据60%以上。这特别适合XML web服务,因为XML数据的压缩率可以非常高。
但是一般服务器不会为你发送压缩数据,除非你告诉服务器你可以处理压缩数据。
因此,您需要像这样修改代码:
导入urllib2,httplibrequest=urllib2。request(' http://xxxx . com ')request . add _ header(' Accept-encoding '' gzip ')1 opener=URL lib 2 . build _ opener()f=opener . open(request)
这是关键:创建一个请求对象,添加一个Accept-encoding头来告诉服务器您可以接受gzip压缩数据。
然后是数据的解压缩:
import string io import gzipcompresseddata=f . read()compressed stream=string io。StringIO(compressed data)gzipper=gzip。GzipFile(file obj=compressed stream)print gzipper . read()
8、多线程并发提取
如果单线程太慢,就需要多线程。下面是一个简单的线程池模板。这个程序只是简单的打印1-10,但是可以看出是并发的。
虽然python的多线程很蹩脚,但是对于频繁网络类型的爬虫来说,还是可以在一定程度上提高效率的。
从线程导入线程从队列导入线程从时间导入睡眠# q是任务队列#NUM是并发线程总数#JOBS是多少任务q=Queue()NUM=2JOBS=10#具体的处理函数,负责处理单个任务def do _ something _ using(arguments):print arguments #这是一个工作进程。负责不断从队列中取数据并处理def working():while true:arguments=q . get()do _ something _ using(arguments)sleep(1)q . task _ done()# fork NUM线程等待i in range(NUM)的队列。t=thread(target=working)t . set daemon(true)t . start()#为范围内的I排队作业(JOBS): q.put(i)#等待所有作业完成q.join()。
声明本站所有作品图文均由用户自行上传分享,仅供网友学习交流。若您的权利被侵害,请联系我们