用python做网页抓取与解析入门笔记[zz]
(from http://chentingpc.me/article/?id=961)
事情的起因是,我做survey的时候搜到了这两本书:Computational Social Network Analysis和Computational Social Network,感觉都蛮不错的,想下载下来看看,但是点开网页发现这个只能分章节下载,晕,我可没时间一章一章下载,想起了迅雷的下载全部链接,试试看,果真可以把他们一网打尽,但是,sadly,迅雷下载的时候,文件名没办法跟章节名对应起来,晕,我可没时间一章一章去改名字,怎么办呢?由于做过网站,我看着它那“整洁”的页面就笑了,因为这种规整的页面是有规律可循的,虽然下载PDF的每个链接都含有用HASH随机生成的数字码,但是HTML+CSS的排版是规整的,就可以用正则等方法来把title和PDF都挖出来并且一一对应上。想到下一步是要用到网页分析、抓取、下载的技术的,所以,今天就把这个技术给拿下吧。由于python似乎是我知道的这方面的“利器”,有比较好的原生和社区支持,简单明了以及良好的跨平台性,所以就用python来做这个工作了。
S1.目标
- 抓取一个网页并分析,从而:
- 得到半结构化数据,如抓取新浪微博一个页面中的内容。
- 得到其他网页的指针,如抓取新浪微博中下一个页面。
- 下载文件,如这次要下载PDF的任务。
- 多线程抓取与分布式抓取。
- 自动密钥破解。
S2.方法概述
有多少种方法可以用的呢?
1.自己写
urllib2+urlparse+re
最原始的办法,其中urllib2是python的web库、urlparse能处理url、re是正则库,这种方法写起来比较繁琐,但也比较“实在”,具体可以参考[4].
urllib2+beautifulsoup
这里的得力干将是beautifulsoup[5],beautifulsoup可以非常有效的解析HTML页面,就可以免去自己用re去写繁琐的正则等。我比较喜欢这种方法,在下面具体讲解部分会详解。
Mechanize+BeautifulSoup
Mechanize是对于urllib2的部分功能的替换,使得除了http以外其他任何连接也都能被打开,也更加动态可配置,具体参考[6].
PycURL,据说速度非常快,具体方法可以参考[1][2].
2.公开库
Scrapy
这个暂且未尝试,这种公开的库的有点应该就是速度快、更强大,好像是可以并行的,所以以后有时间再尝试下。
其他更多的开源库参考[3].
S3.具体讲解
假设你已经把python安装好了(我用的版本是python2.7),现在我们用urllib2+BeautifulSoup的方法来抓取springerlink网站上的Computational Social Network Analysis和Computational Social Network,也就是上面提到的,这两本书。
BeautifulSoup的安装,我是在Windows下安装的,官网上没有window下安装的教程,我是凭感觉装上的。它有一个setup.py,我就用"python.exe setup.py install"运行了,但提示"error: package directory 'bs4' does not exist",原来是默认python执行路径不在当前目录,而是在C盘下面的用户目录中,所以把bs4文件移动过去就好了。跑完好,生成一个build文件夹,我知道它肯定要放到Python文件下的LIB文件夹里面去,所以就把下面的bs4移到LIB中去,就可以了。以后要用,直接import即可。如果是linux用户装起来应该会更顺利些。
用urllib2抓取网页/下载文件,urllib中最关键的可能就是urlopen这个函数了,返回的就是这个webpage/文件对象,可以用read等方法将其读出来。urlopen这个函数的参数可以是url也可以是Request,如下:
req = urllib2.Request(url, headers={'User-Agent' : "Magic Browser"})
webpage= urllib2.urlopen(req)
webpage.read()...
这里要注意的一点是headers={‘User-Agent’:'Magic Browser'},这个最好加上,否则的话,由于内部信息默认显示为机器代理,可能被服务器403 Forbidden拒绝访问,在抓取springelink.com上数据的时候不加上一定会被403毙掉的。
用BeautifulSoup处理解析网页,import后,一切从soup = BeautifulSoup(webpage.read( ))开始,你可以用python的终端自己玩玩这个产生的soup对象。我这里就说下一种我比较喜欢的用法,详细具体的API参考[9].我喜欢用嵌套的方式来提取内容,什么意思呢,其实我认为大多数解析定位问题,其实就是下面这样一个问题:
假设有一个页面如下:

并且你已经用soup = BeautifulSoup()初始过了,现在你要根据<div id="a"> -> <div class='aa'> -> <p>这样的结构把下面所有的链接抽取出来,怎么做呢?比较简单的做法,就是一层一层向下分析,具体如下:
top_div = soup.find('div', {'id':'a'}) #注意:返回的是list对象
aa_div = top_div.findAll('div', {'class':'aa'}) #同样是list对象
links = [div.findAll('a') for div in aa_div] #还是list对象
links[0].get('href') ##
links[0].contents #ff
除了链接以外,其他内容也是通过类似的方法解析得到。(PS,我发现我若干个小时前自己还没解决这个问题的时候在SO上发的一个问题已经有人回答了,真好,那时候其实是困在了对list对象直接用find_all出错)
S4.Ending
好吧,最后看看我们的战利品:

声明1,其实有一个2M多的文件下载失败了,今天网络确实有点慢,其实用chrome下载它也差点失败了,因此,其实还是有可改进的地方。当然,可改进地方多了,多线程啥的,暂不讨论了。
声明2,由于是用T学校的网来下的,并且没有复制扩散内容,所以没有侵权!
最后感叹下,最近多以看论文为主,好久没学“技术”了,今天用了一些时间搞搞这种敏捷学习,重新体验那种多线程、开N个窗口、各种任务并发的感觉,真舒服,哈哈:-D
Reference
[2] http://pycurl.sourceforge.net/
[3] http://en.wikipedia.org/wiki/Web_crawler#Open-source_crawlers
[4] http://ryanmerl.com/2009/02/14/python-web-crawler-in-less-than-50-lines/
[5] http://www.crummy.com/software/BeautifulSoup/
[6] http://wwwsearch.sourceforge.net/mechanize/
[8] https://github.com/scrapy/dirbot
[9] http://www.crummy.com/software/BeautifulSoup/bs4/doc/
源代码下载:code
(from http://chentingpc.me/article/?id=961)
用python做网页抓取与解析入门笔记[zz]的更多相关文章
- 爬虫学习笔记(1)-- 利用Python从网页抓取数据
最近想从一个网站上下载资源,懒得一个个的点击下载了,想写一个爬虫把程序全部下载下来,在这里做一个简单的记录 Python的基础语法在这里就不多做叙述了,黑马程序员上有一个基础的视频教学,可以跟着学习一 ...
- Python爬虫,抓取淘宝商品评论内容!
作为一个资深吃货,网购各种零食是很频繁的,但是能否在浩瀚的商品库中找到合适的东西,就只能参考评论了!今天给大家分享用python做个抓取淘宝商品评论的小爬虫! 思路 我们就拿"德州扒鸡&qu ...
- 使用Python中的urlparse、urllib抓取和解析网页(一)(转)
对搜索引擎.文件索引.文档转换.数据检索.站点备份或迁移等应用程序来说,经常用到对网页(即HTML文件)的解析处理.事实上,通过Python 语言提供的各种模块,我们无需借助Web服务器或者Web浏览 ...
- Python之HTML的解析(网页抓取一)
http://blog.csdn.net/my2010sam/article/details/14526223 --------------------- 对html的解析是网页抓取的基础,分析抓取的 ...
- Python中的urlparse、urllib抓取和解析网页(一)
对搜索引擎.文件索引.文档转换.数据检索.站点备份或迁移等应用程序来说,经常用到对网页(即HTML文件)的解析处理.事实上,通过Python 语言提供的各种模块,我们无需借助Web服务器或者Web浏览 ...
- Python开发爬虫之动态网页抓取篇:爬取博客评论数据——通过Selenium模拟浏览器抓取
区别于上篇动态网页抓取,这里介绍另一种方法,即使用浏览器渲染引擎.直接用浏览器在显示网页时解析 HTML.应用 CSS 样式并执行 JavaScript 的语句. 这个方法在爬虫过程中会打开一个浏览器 ...
- Python实现简单的网页抓取
现在开源的网页抓取程序有很多,各种语言应有尽有. 这里分享一下Python从零开始的网页抓取过程 第一步:安装Python 点击下载适合的版本https://www.python.org/ 我这里选择 ...
- Python网络爬虫笔记(一):网页抓取方式和LXML示例
(一) 三种网页抓取方法 1. 正则表达式: 模块使用C语言编写,速度快,但是很脆弱,可能网页更新后就不能用了. 2. Beautiful Soup 模块使用Python编写,速度慢. ...
- Python爬虫之三种网页抓取方法性能比较
下面我们将介绍三种抓取网页数据的方法,首先是正则表达式,然后是流行的 BeautifulSoup 模块,最后是强大的 lxml 模块. 1. 正则表达式 如果你对正则表达式还不熟悉,或是需要一些提 ...
随机推荐
- excel自定义数据验证
1. 判断必须为5位或者9位的数字 2. 自定义限制级别和提示消息
- angular中的 登录检查 和 过期Session清理
angular利用ui-router进行登录检查 SAP都会有这个问题,session过期或者页面被刷新的情况下应该进入登录页. 监听ui-router的satte事件可以实现当state切换的时候检 ...
- Android——复制项目出现Application Installation Failed
今天把一个项目复制到另一个文件夹下,重新打开结果不能正常安装到虚拟机上了. 解决方法: Build——Clean Project :清除一下项目缓存 Build——Rebuild Project ...
- 腾讯云ubuntu搭建jdk
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6377878.html 在购买了腾讯云ubuntu主机后,需要手动搭建java环境.安装tomcat等.ubun ...
- 〖Android〗快速部署SSHD和Bash Shell(程序:DroidSSHD和BetterTerminalEmulatorPro)
--此文仅做个人配置记录-- 因为我经常需要sshd来连接设备,它抓取logcat日志太方便了,方便排查问题,及多人共享: 及有USB孔限制的人来说,这个更具有意义: 把超级终端增强包部署到内网,也是 ...
- 彻底抛弃脚本录制,LR脚本之使用web_custom_request函数自定义
原文 http://www.cnblogs.com/Bonnie83/p/3525200.html 初学性能测试时候,第一步必学脚本录制,但一路下来各种录制失败.回放脚本失败的问题层出不穷,究其原因 ...
- C++中的class (1)
1.public:public表明该数据成员.成员函数是对全部用户开放的,全部用户都能够直接进行调用 2.private:private表示私有,私有的意思就是除了class自己之外,不论什么人都不能 ...
- 【js+jquery】通用、简单的JS 提示框
1.该插件不需要依赖 jquery,仅仅使用了原生js 2.简单.通用.可自定义修改样式.支持等待N秒消失.支持消失后跳转其他url , 功能还是比较完善的. 3.不废话,上代码: (我存放的位置在 ...
- 【php正则】php正则匹配UTF-8格式的中文汉字 和 【,】【,】【。】等符号
1.php正则匹配UTF-8格式的中文汉字 和 [,][,][.]等符号 if (preg_match_all("/([\x{4e00}-\x{9fa5}]+((,)?)+((,)?)+(( ...
- NYOJ------汉诺塔(一)
汉诺塔(一) 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 在印度,有这么一个古老的传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针.印度 ...