美文网首页python
Python写爬虫——抓取网页并解析HTML

Python写爬虫——抓取网页并解析HTML

作者: e1d319510233 | 来源:发表于2019-04-11 11:40 被阅读37次

    UHK上学期有门课叫做Semantic Web,课程project是要搜集整个系里面的教授信息,输入到一个系统里,能够完成诸如“如果选了A教授的课,因时间冲突,B教授的哪些课不能选”、“和A教授实验室相邻的实验室都是哪些教授的”这一类的查询。这就是所谓的“语义网”了啊。。。然而最坑爹的是,所有这些信息,老师并没有给一个文档或者数据库,全要靠自己去系主页上搜集。唯一的想法是写个爬虫,令人悲哀的是,所有做这个project的同学,都是纯人肉手工完成,看得我只想扶墙。。。

    从网页中抓取特定信息,我觉得这是一个普遍性的问题,以后经常会遇到。幸亏那个project只是需要我们系的所有教授的信息,大家人工也就算了。如果需要抓取的信息是海量的,举个栗子,把淘宝上所有的商品目录抓下来,那岂不是要吐血而亡?我决定好好把爬虫研究一下。

    学习Python中的小伙伴,需要学习资料的话,可以前往我的微信公众号:速学Python,后台回复:简书,即可拿Python学习资料

    这里有我自己整理了一套最新的python系统学习教程,包括从基础的python脚本到web开发、爬虫、数据分析、数据可视化、机器学习等。送给正在学习python的小伙伴!这里是python学习者聚集地,欢迎初学和进阶中的小伙伴!

    =

    之前波波写过一个java程序,利用HTML Parser(http://htmlparser.sourceforge.net/)去解析团购网站meituan.com然后把每天的团购信息存到数据库里。稍微改改再爬爬拉手糯米,做个前端,一个团购导航站就问世了。我把程序跑了一下,全自动搜集,不算太复杂。

    但是,我觉得java太啰嗦,不够简洁。Python这个脚本语言开发起来速度很快,一个活生生的例子是因有关政策verycd开始自我阉割,有网友为了抢救资源,把整个verycd站爬了下来,镜像为SimpleCD.org。看了一下爬虫源代码,其实挺简单。使用方法:

    python sitecopy.py http://www.163.com

    看看效果:http://www.lovelucy.info/www.163.com

    1. 获取html页面

    其实,最基本的抓站,两句话就可以了

    import urllib2

    content = urllib2.urlopen('http://XXXX').read()

    这样可以得到整个html文档,关键的问题是我们可能需要从这个文档中获取我们需要的有用信息,而不是整个文档。这就需要解析充满了各种标签的html。

    2. 解析html

    SGMLParser

    Python默认自带HTMLParser以及SGMLParser等等解析器,前者实在是太难用了,我就用SGMLParser写了一个示例程序:

    import urllib2

    from sgmllib import SGMLParser

    class ListName(SGMLParser):

    def __init__(self):

    SGMLParser.__init__(self)

    self.is_h4 = ""

    self.name = []

    def start_h4(self, attrs):

    self.is_h4 = 1

    def end_h4(self):

    self.is_h4 = ""

    def handle_data(self, text):

    if self.is_h4 == 1:

    self.name.append(text)

    content = urllib2.urlopen('http://list.taobao.com/browse/cat-0.htm').read()

    listname = ListName()

    listname.feed(content)

    for item in listname.name:

    print item.decode('gbk').encode('utf8')

    很简单,这里定义了一个叫做ListName的类,继承SGMLParser里面的方法。使用一个变量is_h4做标记判定html文件中的h4标签,如果遇到h4标签,则将标签内的内容加入到List变量name中。解释一下start_h4()和end_h4()函数,他们原型是SGMLParser中的

    start_tagname(self, attrs)

    end_tagname(self)

    tagname就是标签名称,比如当遇到<pre>,就会调用start_pre,遇到</pre>,就会调用 end_pre。attrs为标签的参数,以[(attribute, value), (attribute, value), ...]的形式传回。

    输出:

    虚拟票务

    数码市场

    家电市场

    女装市场

    男装市场

    童装童鞋

    女鞋市场

    男鞋市场

    内衣市场

    箱包市场

    服饰配件

    珠宝饰品

    美容市场

    母婴市场

    家居市场

    日用市场

    食品/保健

    运动鞋服

    运动户外

    汽车用品

    玩具市场

    文化用品市场

    爱好市场

    生活服务

    如果有乱码,可能是与网页编码不一致,需要替换最后一句deconde()的参数,我在HK淘宝默认用的是繁体编码。各位可以copy上面的代码自己试试,把淘宝的商品目录抓下来,就是这么简单。稍微改改,就可以抽取二级分类等其他信息。

    pyQuery

    pyQuery是jQuery在python中的实现,能够以jQuery的语法来操作解析HTML文档,十分方便。使用前需要安装,easy_install pyquery即可,或者Ubuntu下

    sudo apt-get install python-pyquery

    以下例子:

    from pyquery import PyQuery as pyq

    doc=pyq(url=r'http://list.taobao.com/browse/cat-0.htm')

    cts=doc('.market-cat')

    for i in cts:

    print '====',pyq(i).find('h4').text() ,'===='

    for j in pyq(i).find('.sub'):

    print pyq(j).text() ,

    print '/n'

    BeautifulSoup

    有个头痛的问题是,大部分的网页都没有完全遵照标准来写,各种莫名其妙的错误令人想要找出那个写网页的人痛打一顿。为了解决这个问题,我们可以选择著名的BeautifulSoup来解析html文档,它具有很好的容错能力。

    BeautifulSoup功能强大,我还在研究中,有进展会更新本文。

    相关文章

      网友评论

        本文标题:Python写爬虫——抓取网页并解析HTML

        本文链接:https://www.haomeiwen.com/subject/xrftwqtx.html