当前位置: 首页 > 科技观察

Python爬虫:一些常用的爬虫技巧总结

时间:2023-03-12 08:22:50 科技观察

我已经使用Python一年多了。Python使用最广泛的场景是Web快速开发、爬虫、自动化运维:我写过简单的网站,写过自动发帖脚本,写过收发邮件脚本,写过简单的验证码识别脚本。爬虫的开发过程中也有很多复用的过程。这里总结一下,以后可以省点事。1.基本爬取网页get方法importurllib2url="http://www.baidu.com"response=urllib2.urlopen(url)printresponse.read()post方法importurllibimporturllib2url="http://abcde.com"form={'name':'abc','password':'1234'}form_data=urllib.urlencode(form)request=urllib2.Request(url,form_data)response=urllib2.urlopen(request)printresponse.read()2.使用代理IP在开发爬虫的过程中,经常会遇到IP被封的情况。这时候就需要代理IP;在urllib2包中有一个ProxyHandler类,通过它可以设置代理访问网页,如下代码片段所示:importurllib2proxy=urllib2.ProxyHandler({'http':'127.0.0.1:8087'})opener=urllib2.build_opener(proxy)urllib2.install_opener(opener)response=urllib2.urlopen('http://www.baidu.com')printresponse.read()3.Cookies处理Cookies是存储的数据(通常是加密的)某些网站在用户的本地终端上识别用户身份并跟踪会话。Python提供了用于处理cookies的cookielib模块,cookielib模块的主要作用是提供可以存储cookies的对象,以便与urllib2模块一起使用来访问互联网资源。代码片段:importurllib2,cookielibcookie_support=urllib2.HTTPCookieProcessor(cookielib.CookieJar())opener=urllib2.build_opener(cookie_support)urllib2.install_opener(opener)content=urllib2.urlopen('http://XXXX').read()key在CookieJar()中,它用于管理HTTPcookie值、存储HTTP请求生成的cookie以及向传出的HTTP请求添加cookie。整个cookie保存在内存中,CookieJar实例垃圾回收后cookie会丢失,不需要所有进程单独操作。手动添加cookie:cookie="PHPSESSID=91rurfqm2329bopnosfu4fvmu7;kmsign=55d2c12c9b1e3;KMUID=b6Ejc1XSwPq9o756AxnBAg="request.add_header("Cookie",cookie)4.伪装成浏览器有些网站不喜欢爬虫的访问,所以拒绝所有的爬虫问。所以直接用urllib2访问网站时,经常会出现HTTPError403:Forbidden。特别注意一些headers,server端会检查这些headers:1.User-Agent有些Server或者Proxy会检查这个值来判断是否是浏览器发起的Request。2.Content-Type在使用REST接口时,Server会检查这个值来决定如何解析HTTPBody中的内容。这时候可以通过修改http包中的header来实现。代码片段如下:importurllib2headers={'User-Agent':'Mozilla/5.0(Windows;U;WindowsNT6.1;en-US;rv:1.9.1.6)Gecko/20091201Firefox/3.5.6'}request=urllib2.Request(url='http://my.oschina.net/jhao104/blog?catalog=3463517',headersheaders=headers)printurllib2.urlopen(request).read()五、页面分析页面最强大的方法解析当然是正则表达式。这个对于不同网站的不同用户来说是不一样的,就不用过多解释了。附上两个比较好的网址:正则表达式入门: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/639448BeautifulSoup:http://cuiqingcai.com/1319.html对此我对这两个库的评价是,它们都是HTML/XML处理库。Beautifulsoup是纯python实现的,效率低但功能实用。,支持XPath。6、验证码的处理对于一些简单的验证码,可以进行简单的识别。我只是做了一些简单的验证码识别。但是有些反人类的验证码,比如12306,是可以通过打码平台人工打码的,当然这个是需要付费的。7、gzip压缩你有没有遇到过一些网页,不管怎么转码,都是乱码。哈哈,那说明你不知道很多web服务都有发送压缩数据的能力,可以减少60%以上在网络线路上传输的大量数据。对于XMLWeb服务尤其如此,因为XML数据可以高度压缩。但是一般服务器不会给你发送压缩数据,除非你告诉服务器你可以处理压缩数据。所以你需要像这样修改代码:=opener.open(request)这是关键:创建一个Request对象,添加一个Accept-encoding头告诉服务器你可以接受gzip压缩的数据。然后解压数据:importStringIOimportgzipcompresseddata=f.read()compressedstream=StringIO.StringIO(compresseddata)gzipgzipper=gzip.GzipFile(fileobj=compressedstream)printgzipper.read()8。需要多线程。这是一个简单的线程池模板。这个程序只是简单的打印了1-10,但是可以看出是并发的。Python的多线程虽然很鸡肋,但是对于频繁联网的爬虫来说还是可以一定程度上提高效率的。fromthreadingimportThreadfromQueueimportQueuefromtimeimportsleep#q是任务队列#NUM是并发线程总数#JOBS是有多少个任务q=Queue()NUM=2JOBS=10#具体的处理函数负责处理单个任务defdo_somthing_using(arguments):printarguments#这是工作进程,负责不断从队列中取数据并进行处理defworking():whileTrue:arguments=q.get()do_somthing_using(arguments)sleep(1)q.task_done()#forkNUM个线程在等待thequeueforiinrange(NUM):t=Thread(target=working)t.setDaemon(True)t.start()#将JOBS放入队列foriinrange(JOBS):q.put(i)#等待所有JOBS完成加入()