chhy 发表于 2016-7-7 17:00:20

用Python做网页抓取与解析入门笔记

事情的起因是,我做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是正则库,这种方法写起来比较繁琐,但也比较“实在”,具体可以参考.urllib2+beautifulsoup这里的得力干将是beautifulsoup,beautifulsoup可以非常有效的解析HTML页面,就可以免去自己用re去写繁琐的正则等。我比较喜欢这种方法,在下面具体讲解部分会详解。Mechanize+BeautifulSoupMechanize是对于urllib2的部分功能的替换,使得除了http以外其他任何连接也都能被打开,也更加动态可配置,具体参考.PycURL,据说速度非常快,具体方法可以参考.2.公开库Scrapy这个暂且未尝试,这种公开的库的有点应该就是速度快、更强大,好像是可以并行的,所以以后有时间再尝试下。其他更多的开源库参考.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参考.我喜欢用嵌套的 方式来提取内容,什么意思呢,其实我认为大多数解析定位问题,其实就是下面这样一个问题:假设有一个页面如下:http://static.open-open.com/lib/uploadImg/20120828/20120828230918_635.png并且你已经用soup = BeautifulSoup()初始过了,现在你要根据-> -> 这样的结构把下面所有的链接抽取出来,怎么做呢?比较简单的做法,就是一层一层向下分析,具体如下:

top_div = soup.find('div', {'id':'a'}) #注意:返回的是list对象

aa_div = top_div.findAll('div', {'class':'aa'}) #同样是list对象

links = #还是list对象

links.get('href') ##

links.contents #ff

除了链接以外,其他内容也是通过类似的方法解析得到。(PS,我发现我若干个小时前自己还没解决这个问题的时候在SO上发的一个问题已经有人回答了,真好,那时候其实是困在了对list对象直接用find_all出错)S4.Ending好吧,最后看看我们的战利品:http://static.open-open.com/lib/uploadImg/20120828/20120828230919_999.png声明1,其实有一个2M多的文件下载失败了,今天网络确实有点慢,其实用chrome下载它也差点失败了,因此,其实还是有可改进的地方。当然,可改进地方多了,多线程啥的,暂不讨论了。声明2,由于是用T学校的网来下的,并且没有复制扩散内容,所以没有侵权!最后感叹下,最近多以看论文为主,好久没学“技术”了,今天用了一些时间搞搞这种敏捷学习,重新体验那种多线程、开N个窗口、各种任务并发的感觉,真舒服,哈哈:-DReference http://stackoverflow.com/questions/419235/anyone-know-of-a-good-python-based-web-crawler-that-i-could-use#answer-8310728 http://pycurl.sourceforge.net/ http://en.wikipedia.org/wiki/Web_crawler#Open-source_crawlers http://ryanmerl.com/2009/02/14/python-web-crawler-in-less-than-50-lines/ http://www.crummy.com/software/BeautifulSoup/ http://wwwsearch.sourceforge.net/mechanize/ http://scrapy.org/ https://github.com/scrapy/dirbot http://www.crummy.com/software/BeautifulSoup/bs4/doc/源代码下载:code





(from http://chentingpc.me/article/?id=961)


醉清风 发表于 2016-8-18 21:58:01

:):lol:lol

fuganggangxx 发表于 2017-8-21 12:45:50

谢谢分享,非常感谢
页: [1]
查看完整版本: 用Python做网页抓取与解析入门笔记