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

良心推荐!Python爬虫高手必备的8个技能!

时间:2023-03-19 22:16:22 科技观察

想要快速学习爬虫,最值得学习的语言一定是Python。Python的应用场景很多,比如:快速网页开发、爬虫、自动化运维等,可以用于简单的网站、自动发帖脚本、邮件收发脚本、简单的验证码识别脚本。爬虫的开发过程中也有很多复用的过程。今天我就总结一下必备的8个技巧,以后可以省时省力,高效的完成任务。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提供了cookielib模块用于处理cookies,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()关键在于CookieJar(),它用于管理HTTPcookie值、存储HTTP请求生成的cookie以及向传出的HTTP请求添加cookie。整个cookie保存在内存中,CookieJar实例垃圾回收后cookie会丢失,不需要所有进程单独操作。手动添加cookies:cookie="PHPSESSID=91rurfqm2329bopnosfu4fvmu7;kmsign=55d2c12c9b1e3;KMUID=b6Ejc1XSwPq9o756AxnBAg="request.add_header("Cookie",cookie)4.伪装成浏览器。问。所以直接用urllib2访问网站时,经常会出现HTTPError403:Forbidden。特别注意一些headers,server端会检查这些headers:User-Agent有些Server或者Proxy会检查这个值来判断是否是浏览器发起的RequestContent-Type。在使用REST接口时,Server会检查值Value,用于决定如何解析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',headers=headers)printurllib2.urlopen(request).read()5.页面分析最强大页面解析的方法当然是正则表达式,对于不同网站的不同用户来说是不一样的,所以没必要用太多说明其次是解析库。常用的库有两个,lxml和BeautifulSoup。我对这两个库的评价是,都是HTML/XML处理库。Beautifulsoup是用纯python实现的。通过结果搜索获取某个HTML节点的源码;lxml采用C语言编码,高效且支持XPath。6、验证码的处理对于一些简单的验证码,可以进行简单的识别。我只是做了一些简单的验证码识别。但是有些反人类的验证码,比如12306,是可以通过打码平台人工打码的,当然这个是需要付费的。7、gzip压缩你有没有遇到过一些网页,不管怎么转码,都是乱码。哈哈,那说明你不知道很多web服务都有发送压缩数据的能力,可以减少60%以上在网络线路上传输的大量数据。对于XMLWeb服务尤其如此,因为XML数据可以高度压缩。但是一般服务器不会给你发送压缩数据,除非你告诉服务器你可以处理压缩数据。所以你需要像这样修改代码:f=开瓶器。open(request)这是关键:创建一个Request对象,添加一个Accept-encodingheader告诉服务器你可以接受gzip压缩数据。然后就是解压后的数据:importStringIOimportgzipcompresseddata=f.read()compressedstream=StringIO.StringIO(compresseddata)gzipper=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()#forkNUMthreadswaitinginthequeueforiinrange(NUM):t=Thread(target=working)t.setDaemon(True)t.start()#将JOBS放入队列中foriinrange(JOBS):q.put(i)#等待所有JOBS完成q.join()