互联网大数据:Python实现网络爬虫(实战练习案例)

标签:
静态页面post表单http基本接入认证javascript动态页面pythonselenium第三 |
分类: IT/OT/IOT:工业通讯三网融合 |
【0. 前言】
实战中Python结合第三方库,可应对不同类型网站有效获取数据,以下是Python网络爬虫的一些实例分析。
【1. Python爬取常规静态页面数据】
不需要登录等处理的网站最容易,直接用Get方法请求URL即可从服务器获取到返回数据,例如处理博客文章。
实例:1)需求:假设我们需要及时感知到电脑管家官网上相关产品下载链接的变更,这就要求我们写个自动化程序从官网上爬取到电脑管家的下载链接。2)分析:在浏览器中打开https://guanjia.qq.com,按下F12,查看网络请求。这里只有一个Get请求,没有登录,也不涉及加密过程。点击Elements,很容易从源码中找到下载链接。3)方案:Requests是Python的第三方库,可以发送网络请求数据并获取服务器返回的源码。使用Requests库获取到Html文件,然后利用正则等字符串解析手段或者BeautifulSoup第三方库完成信息提取。
要点:1)有些网络服务器反感爬虫,会对请求头做个简单判别,直接拒绝那些明显是由自动化程序发起的请求。例如Python程序使用的默认请求头User-Agent值为Python-urllib/3.4,而真实的浏览器在访问时User-Agent值为:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36(KHTML, like Gecko) Chrome/43.0.2357.124 Safari/537.3。为了避免自动化程序被拒绝,在请求时可以修改请求头,让自动化程序更像一个浏览器。2)网页爬取时,可能会遇到不允许访问外网的情况,这时就需要设置代理IP: requests.get("https://guanjia.qq.com", proxies={“http”:“127.0.0.1:8087”})。3)BeautifulSoup库是HTML/XML解析器,可以很好处理不规范标记并生成剖析树,通常用来分析爬虫抓取的Web文档,节省编程时间。
【2. Python爬取POST表单网页数据】
通过HTTP协议的Get方法去请求信息,对应网站不涉及Post表单,而现在大部分网站要登录涉及Post表单。表单是含有
标签,是要交互的数据区域,访问者可能需要输入文字、做下拉选择等,完成与服务器交互。
实例:1)需求:访问网址,并输出服务器返回内容。2)分析:在浏览器中打开http://pythonscraping.com/pages/cookies/welcome.php,展示了登录界面,按下F12,可看到username很明显这是一个表单。点击登录后查看Network,会发现看到一个post请求以及请求参数。当登录完成后,即可访问http://pythonscraping.com/pages/cookies/profile.php,查看网址中详细内容。3)方案:使用Requests库完成Post表单操作,如下所示,登录后页面内容解析和前文一致,故不再详细赘述。
要点:1)注意cookie的追踪。一旦网站验证了登录权证,它将会将登陆权证保存在浏览器的cookie中,若是我们一直自己处理cookie的追踪,在面对复杂网址时将会比较麻烦,降低开发效率。可以使用Session对象,就如上述截图代码中。Session会持续跟踪会话信息,包括cookie,header。调用session.cookie.get_dict()查看当前session cookie值。2)在表单中存在“隐含”字段,该字段是对浏览器可见,但是对用户不可见。一般而言,“隐含”字段是在每次Get请求时生成,每次打开同个网址,同个“隐含”值不一样。这个处理有一定的反爬虫效果。至于“隐含”字段是否作为post参数,可以手动在浏览器下完成表单请求,观察请求参数是否包含某个“隐含”参数,找出这些“隐含”字段,并在Post时带上。之前的header、代理IP同样适用于这里。
【3. Python爬取HTTP基本接入认证网页数据】
基本认证是用来允许Web浏览器后者其他客户端程序在请求时,提供用户名和口令形式的身份凭证的一种登录验证方式。把“用户名+冒号+密码”用BASE64算法加密后的字符串放到httprequest中的headerAuthorization中发送给服务端。在发明cookie之前,HTTP基本认证是处理网站登录最常用的方法,目前一些安全性比较高的网址还在使用这种方式。
实例:1)需求:访问某网站,涉内不对外。2)分析:在浏览器中输入该网址,看到登录页面,需要输入用户名和密码才能得到所需要的数据,否则返回错误代码401,要求用户重新提供用户名和密码。用fiddle抓取中间数据时,header中有security authorization信息,很明显这是一个HTTP基本认证。3)方案:这实际是个Post请求,和普通Post请求的区别是:在每次请求数据时,需要用BASE64加密用户名和密码,并附加到请求头中。Requests库提供了一个auth模块专门用于处理HTTP认证,这样就不用自己做加密处理。代码如下图:
要点:目前有多种HTTP登录验证方法,常用的是基本验证和摘要验证,auth模块提供摘要验证处理方法。
【4. Python爬取JavaScript动态页面数据】
静态页面和含有Post表单网站的爬虫方式,相对比较简单。而实际网页爬虫工作中遇到的页面情况就更加多样复杂了。如:1)网页中包含javascript代码,需要经过渲染处理才能获取原始数据;2)网站具有一定反爬虫能力,有些cookie是需要客户端脚本执行JS后才会产生,而requests模块又不能执行JS代码,如果常规处理post表单,会发现少了部分cookie,导致请求被拒绝。很多知名网站反爬虫工作都做的比较好,很难找到简单post表单。这种情况下,可以尝试“python+selenium+第三方浏览器“。
实例:1)需求:登录微软官网https://connect.microsoft.com/site1304/Downloads,自动下载微软最近发布iso文件。2)分析:当我们使用python request库去获取服务器源码时,发现python获取的源码和浏览器上渲染出的场景不一样,Python拿到是JS源码。Python有个第三方库PyV8,该库可以执行JS代码,但执行效率低,此外微软官网还涉及JS加密的Cookie,若是采用Requests+Pyv8+BeautifulSoup三种库组合方式处理,那代码会显得臃肿杂乱,相对而言selenium更加简洁易懂 。“Selenium+第三方浏览器”可以让浏览器自动加载页面,由浏览器执行JS从而获取到需要的数据,这样Python代码就无需实现浏览器客户端的功能。“Selenium + 第三方浏览器”组成了一个强大的网络爬虫,可以处理cookie、javascript等页面爬取情况。第三方浏览器分有界面(Chrome)和无界面(PhantomJS),有界面浏览器就是可以直接看到浏览器被打开以及跳转的过程。无界面浏览器会将网站加载到内存并执行页面上的JS,不会有图形界面。根据自己喜好或者需求选择第三方浏览器。3)方案:采用“Selenium+Chrome”方式,下载安装Python的Selenium库->下载ChromeDriver到本地->利用Webdriver Api完成对页面的操作。以下代码在初始化webdriver时设置了网络代理、指定了浏览器下载文件保存路径、让chrome提示下载进度等信息。
要点:在实例化webdriver时,可以通过参数对浏览器做些设置,如设置网络代理、浏览器下载文件保存路径等。若是不传参数,则默认继承本地浏览器设置。若是对浏览器启动时属性进行设置,则就利用到了ChromeOption类。具体信息可参考chromedriver官网。“Python+Selenium+第三方浏览器”可以处理多种爬虫场景,包括静态页面,post表单,以及JS等。应用场景很强大,使用selenium操作浏览器进行模拟点击的方式就可以让我们省心很多,不需要担心有什么“隐藏字段”、cookie追踪等。但对于包含验证码网页的操作,这种方式也不好处理,主要困难在于图像识别。若是页面包含验证码,那就需要结合图像识别工具了,这种情况相对也比较难处理,图像识别准确率受到图片内容影响。
【5.
更多Python网络爬虫实战练习】
1)WechatSogou - 微信(http://lib.csdn.net/base/wechat)公众号爬虫。基于搜狗微信搜索的微信公众号爬虫接口,通过搜狗搜索获取公众号的openid,创建公众号历史消息请求URL,解析出历史消息总量、历史消息总页数、单个历史消息的XML,根据读取到的所有的历史消息XML内容,创建RSS文件。
代码:https://github.com/Chyroc/WechatSogou
2)DouBanSpider - 豆瓣读书爬虫。可以爬下豆瓣读书标签下的所有图书,按评分排名依次存储,存储到Excel中,可方便大家筛选搜罗,比如筛选评价人数>1000的高分书籍;可依据不同的主题存储到Excel不同的Sheet ,采用User Agent伪装为浏览器进行爬取,并加入随机延时来更好的模仿浏览器行为,避免爬虫被封。
代码:https://github.com/lanbing510/DouBanSpider
3)zhihu_spider - 知乎爬虫。此项目的功能是爬取知乎用户信息以及人际拓扑关系,爬虫框架使用scrapy,数据存储使用mongo。
代码:https://github.com/LiuRoy/zhihu_spider
4)bilibili-user - Bilibili用户爬虫。总数据数:20119918,抓取字段:用户id,昵称,性别,头像,等级,经验值,粉丝数,生日,地址,注册时间,签名,等级与经验值等。抓取之后生成B站用户数据报告。
代码:https://github.com/airingursb/bilibili-user
5)SinaSpider
代码:https://github.com/LiuXingMing/SinaSpider
6)distribute_crawler - 小说下载分布式爬虫。使用scrapy,Redis, MongoDB,graphite实现的一个分布式网络爬虫,底层存储mongodb集群,分布式使用redis实现,爬虫状态显示使用graphite实现,主要针对一个小说站点。
代码:https://github.com/gnemoug/distribute_crawler
7)CnkiSpider - 中国知网爬虫。设置检索条件后,执行src/CnkiSpider.py抓取数据,抓取数据存储在/data目录下,每个数据文件的第一行为字段名称。
代码:https://github.com/yanzhou/CnkiSpider
8)LianJiaSpider - 链家网爬虫。爬取北京地区链家历年二手房成交记录。涵盖链家爬虫一文的全部代码,包括链家模拟登录代码。
代码:https://github.com/lanbing510/LianJiaSpider
9)scrapy_jingdong - 京东爬虫。基于scrapy的京东网站爬虫,保存格式为csv。
代码:https://github.com/taizilongxu/scrapy_jingdong
10)QQ-Groups-Spider - QQ 群爬虫。批量抓取 QQ 群信息,包括群名称、群号、群人数、群主、群简介等内容,最终生成 XLS(X) / CSV 结果文件。
代码:https://github.com/caspartse/QQ-Groups-Spider
11)QQSpider -
QQ空间爬虫,包括日志、说说、个人信息等,一天可抓取 400 万条数据。
代码:https://github.com/LiuXingMing/QQSpider
12)tbcrawler - 淘宝和天猫的爬虫,可以根据搜索关键词,物品id来抓去页面的信息,数据存储在mongodb。
代码:https://github.com/caspartse/QQ-Groups-Spider
【END】