Python用了快一年了,python应用最广泛的场景是web快速开发、爬虫、自动运维:简单的网站、自动发帖脚本、邮件收发脚本、简单的验证码识别脚本。
爬虫的开发过程中也有很多复用的过程。这里这是一个总结,可以在将来省去一些麻烦。
1、网页的基本抓取
获取方法
导入URL lib 2 URL http://www . Baidu . com respons=URL lib 2 . urlopen(URL)print response . read()
方法发布
导入URL libimport URL lib 2 URL=http://abcde.com form={ 姓名'abc , '密码'1234'} form _ data=URL lib . urlencode(form)request=URL lib 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 )打印response.read()
3、 cookie处理
Cookies是一些网站存储在用户身上的数据(通常是加密的本地终端,以便识别用户和跟踪会话。python提供了cookielib模块来处理cookies,cookielib模块的主要作用是提供可以存储cookies的对象,这样就可以配合urllib2模块来访问互联网资源。
代码片段:
导入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存储在内存中,cookie在对CookieJar实例进行垃圾收集后会丢失,所以不需要单独操作所有的进程。
手动添加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)
4、伪装成浏览器
有些网站反感爬虫的访问,所以拒绝所有爬虫的请求。所以在使用urllib2直接访问网站时,经常会出现HTTP错误403: Forbidden的情况。
特别注意一些头,服务器端会检查这些头。
用户代理某些服务器或代理将检查该值,以确定是否是浏览器发起了请求。
Content-Type当使用REST接口时,服务器将检查该值以确定如何解析HTTP主体中的内容。
这可以通过修改http数据包中的报头来实现。代码片段如下:
导入urllib2headers={ 用户代理'Mozilla/5.0(Windows;u;Windows NT 6.1en-US;rv:1.9.1.6)壁虎/20091201火狐/3 . 5 . 6 }request=urllib2。请求(url=http://my.oschina.net/jhao104/blog?catalog=3463517 ,headers=headers)打印urllib2.urlopen(请求)。阅读()
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。请求(http://xxxx.com )request . add _ header(接受-编码 'gzip )1 opener=URL lib 2 . build _ opener()f=opener . open(请求)
这是关键:创建一个请求对象,并添加一个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 多线程是个鸡肋,对于频繁网络爬虫来说还是能在一定程度上提高效率的。
from threading import thread from Queue import Queue from time import sleep # 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()
标签:=爬虫服务器