您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > Python-入门网络爬虫之精华版
Python入门网络爬虫之精华版Author:LiNingEmail:lining0806@gmail.comBlog:宁哥的小站Python学习网络爬虫主要分3个大的版块:抓取,分析,存储另外,比较常用的爬虫框架Scrapy,这里最后也详细介绍一下。首先列举一下本人总结的相关文章,这些覆盖了入门网络爬虫需要的基本概念和技巧:宁哥的小站-网络爬虫当我们在浏览器中输入一个url后回车,后台会发生什么?比如说你输入,你就会看到宁哥的小站首页。简单来说这段过程发生了以下四个步骤:查找域名对应的IP地址。向IP对应的服务器发送请求。服务器响应请求,发回网页内容。浏览器解析网页内容。网络爬虫要做的,简单来说,就是实现浏览器的功能。通过指定url,直接返回给用户所需要的数据,而不需要一步步人工去操纵浏览器获取。抓取这一步,你要明确要得到的内容是是什么?是HTML源码,还是Json格式的字符串等。1.最基本的抓取抓取大多数情况属于get请求,即直接从对方服务器上获取数据。首先,Python中自带urllib及urllib2这两个模块,基本上能满足一般的页面抓取。另外,requests也是非常有用的包,与此类似的,还有httplib2等等。Requests:importrequestsresponse=requests.get(url)content=requests.get(url).contentprintresponseheaders:,response.headersprintcontent:,contentUrllib2:importurllib2response=urllib2.urlopen(url)content=urllib2.urlopen(url).read()printresponseheaders:,response.headersprintcontent:,contentHttplib2:importhttplib2http=httplib2.Http()response_headers,content=http.request(url,'GET')printresponseheaders:,response_headersprintcontent:,content此外,对于带有查询字段的url,get请求一般会将来请求的数据附在url之后,以?分割url和传输数据,多个参数用&连接。data={'data1':'XXXXX','data2':'XXXXX'}Requests:data为dict,jsonimportrequestsresponse=requests.get(url=url,params=data)Urllib2:data为stringimporturllib,urllib2data=urllib.urlencode(data)full_url=url+'?'+dataresponse=urllib2.urlopen(full_url)2.对于登陆情况的处理2.1使用表单登陆这种情况属于post请求,即先向服务器发送表单数据,服务器再将返回的cookie存入本地。data={'data1':'XXXXX','data2':'XXXXX'}Requests:data为dict,jsonimportrequestsresponse=requests.post(url=url,data=data)Urllib2:data为stringimporturllib,urllib2data=urllib.urlencode(data)req=urllib2.Request(url=url,data=data)response=urllib2.urlopen(req)2.2使用cookie登陆使用cookie登陆,服务器会认为你是一个已登陆的用户,所以就会返回给你一个已登陆的内容。因此,需要验证码的情况可以使用带验证码登陆的cookie解决。importrequestsrequests_session=requests.session()response=requests_session.post(url=url_login,data=data)若存在验证码,此时采用response=requests_session.post(url=url_login,data=data)是不行的,做法应该如下:response_captcha=requests_session.get(url=url_login,cookies=cookies)response1=requests.get(url_login)#未登陆response2=requests_session.get(url_login)#已登陆,因为之前拿到了ResponseCookie!response3=requests_session.get(url_results)#已登陆,因为之前拿到了ResponseCookie!相关参考:网络爬虫-验证码登陆参考项目:爬取知乎网站3.对于反爬虫机制的处理3.1使用代理适用情况:限制IP地址情况,也可解决由于“频繁点击”而需要输入验证码登陆的情况。这种情况最好的办法就是维护一个代理IP池,网上有很多免费的代理IP,良莠不齐,可以通过筛选找到能用的。对于“频繁点击”的情况,我们还可以通过限制爬虫访问网站的频率来避免被网站禁掉。proxies={'http':'}Requests:importrequestsresponse=requests.get(url=url,proxies=proxies)Urllib2:importurllib2proxy_support=urllib2.ProxyHandler(proxies)opener=urllib2.build_opener(proxy_support,urllib2.HTTPHandler)urllib2.install_opener(opener)#安装opener,此后调用urlopen()时都会使用安装过的opener对象response=urllib2.urlopen(url)3.2时间设置适用情况:限制频率情况。Requests,Urllib2都可以使用time库的sleep()函数:importtimetime.sleep(1)3.3伪装成浏览器,或者反“反盗链”有些网站会检查你是不是真的浏览器访问,还是机器自动访问的。这种情况,加上User-Agent,表明你是浏览器访问即可。有时还会检查是否带Referer信息还会检查你的Referer是否合法,一般再加上Referer。headers={'User-Agent':'XXXXX'}#伪装成浏览器访问,适用于拒绝爬虫的网站headers={'Referer':'XXXXX'}headers={'User-Agent':'XXXXX','Referer':'XXXXX'}Requests:response=requests.get(url=url,headers=headers)Urllib2:importurllib,urllib2req=urllib2.Request(url=url,headers=headers)response=urllib2.urlopen(req)4.对于断线重连不多说。defmulti_session(session,*arg):whileTrue:retryTimes=20whileretryTimes0:try:returnsession.post(*arg)except:print'.',retryTimes-=1或者defmulti_open(opener,*arg):whileTrue:retryTimes=20whileretryTimes0:try:returnopener.open(*arg)except:print'.',retryTimes-=1这样我们就可以使用multi_session或multi_open对爬虫抓取的session或opener进行保持。5.多进程抓取这里针对华尔街见闻进行多进程抓取的实验对比:Python多进程抓取与Java多进程抓取相关参考:关于Python和Java的多进程多线程计算方法对比6.对于Ajax请求的处理对于“加载更多”情况,使用Ajax来传输很多数据。它的工作原理是:从网页的url加载网页的源代码之后,会在浏览器里执行JavaScript程序。这些程序会加载更多的内容,“填充”到网页里。这就是为什么如果你直接去爬网页本身的url,你会找不到页面的实际内容。这里,若使用GoogleChrome分析”请求“对应的链接(方法:右键→审查元素→Network→清空,点击”加载更多“,出现对应的GET链接寻找Type为text/html的,点击,查看get参数或者复制RequestURL),循环过程。如果“请求”之前有页面,依据上一步的网址进行分析推导第1页。以此类推,抓取抓Ajax地址的数据。对返回的json格式数据(str)进行正则匹配。json格式数据中,需从'\uxxxx'形式的unicode_escape编码转换成u'\uxxxx'的unicode编码。7.自动化测试工具SeleniumSelenium是一款自动化测试工具。它能实现操纵浏览器,包括字符填充、鼠标点击、获取元素、页面切换等一系列操作。总之,凡是浏览器能做的事,Selenium都能够做到。这里列出在给定城市列表后,使用selenium来动态抓取去哪儿网的票价信息的代码。相关参考:网络爬虫之Selenium使用代理登陆:爬取去哪儿网站8.验证码识别对于网站有验证码的情况,我们有三种办法:使用代理,更新IP。使用cookie登陆。验证码识别。使用代理和使用cookie登陆之前已经讲过,下面讲一下验证码识别。可以利用开源的Tesseract-OCR系统进行验证码图片的下载及识别,将识别的字符传到爬虫系统进行模拟登陆。如果不成功,可以再次更新验证码识别,直到成功为止。参考项目:Captcha1爬取还有一个需要注意的问题:如何监控一系列网站的更新情况,也就是说,如何进行增量式爬取?分析抓取之后就是对抓取的内容进行分析,你需要什么内容,就从中提炼出相关的内容来。常见的分析工具有正则表达式,BeautifulSoup,lxml等等。存储分析出我们需要的内容之后,接下来就是存储了。我们可以选择存入文本文件,也可以选择存入MySQL或MongoDB数据库等。存储有两个需要注意的问题:以什么形式存储?如何进行内容去重?ScrapyScrapy是一个基于Twisted的开源的Python爬虫框架,在工业中应用非常广泛。相关内容可以参考基于Scrapy网络爬虫的搭建,同时给出这篇文章介绍的微信搜索爬取的项目代码,给大家作为学习参考。参考项目:使用Scrapy或Requests递归抓取微信搜索结果
本文标题:Python-入门网络爬虫之精华版
链接地址:https://www.777doc.com/doc-4210914 .html