Python网络爬虫试水分类目录

看旁边同事阿福每晚回去刷题研究算法,我来了一句,咋们用python把抓包分析改写了耍耍如何,pylibpcap和pynids接口都有,只不过上个月尝试过,在两者衔接的地方一直没有搞定,有福同学老道地说了一句:我倒是只想把HTTP部分改写下,听了他的话,感觉的确如此,那两部分都已经很成熟了,改来改去也就那模样,倒是HTTP的解析貌似更合适,过了会,他又来了句:我觉得还不如搞一个网络爬虫

网络爬虫只是有个大概的概念,一直没动手干点啥,现在就凭自己的想法来爬点东西,就拿自己主页做实验好了,瞄了下,看上了wordpress里的分类目录这一栏,想个办法将任意给定URL页面的所有分类目录给爬出来

网页全部都是一些标签组合,打开chrome,审查元素,可以轻易定位到分类目录每行是由下列代码完成的:

<a href=”http://www.lihuia.com/?cat=6″>LINUX</a>

<a href=”http://www.lihuia.com/?cat=19″>NETWORK</a>

等等

看到这种模子,就感觉太容易了,首先得到html文件,然后通过正则表达式匹配出<a>和</a>之间的内容不就欧了么,说干就干,通过urllib2模块很容易得到html信息,然后通过re模块模式匹配

lihui@LastWish$ cat crawler.py
#!/usr/bin/env python

import urllib2
import re

html = urllib2.urlopen(‘http://www.lihuia.com’).read()
for eachLine in html:
    info = re.search(‘<a href=\”.*\”>(.*)<\/a>’, eachLine)
    if info is not None:
        print info.group(1)

pattern这么写的坏处就是可能将其它类似<a href=”.*”>XXX</a>而不是分类目录的行也匹配进去了,不过没关系,先将所有的行输出来,然后根据差异化修改匹配的模式,最终肯定能得到我们所需要的

但是令人惊奇的是,居然神马输出都没有,这让我有点难以接受,也不存在贪婪非贪婪直接匹配到最后呀,没办法,wget www.lihuia.com,打开index.html瞧瞧,的确这个pattern是能匹配的

只好在for后面加了一行print eachLine,居然一个字符一行地打印,猛的一看,我居然啥时候用了read(),也许是醉了,这是我从来不喜欢的,它会一次性把文件读完,然后放到一个字符串里去,所以for循环一个一个字符地取,将read()去掉就行了

lihui@LastWish $ cat crawler.py
#!/usr/bin/env python

import urllib2
import re

html = urllib2.urlopen(‘http://www.lihuia.com’)
for eachLine in html:
    info = re.search(‘<a href=\”.*\”>(.*)<\/a>’, eachLine)
    if info is not None:
        print info.group(1)

这样的确能将分类都匹配出来,但是,还有一些不是分类的也匹配出来,只好打开index.html来寻找一下他们的差异性,进而修改正则表达式

很容易发现,分类目录的html代码里,标签前面都有 <li class=”cat-item cat-item-X”>这样的内容,这样就容易了,修改下pattern即可,有一点问题很奇怪,html代码里标签<a href=XXX>在反括号前面相比浏览器审查元素居然多了一个空格,不管了,反正就\s+就行了

lihui@LastWish $ cat crawler.py
#!/usr/bin/env python

import urllib2
import re

html_obj = urllib2.urlopen(‘http://www.lihuia.com’)
for eachLine in html_obj:
    info = re.search(‘cat-item-\d+\”><a href=\”.*\”\s*>(.*)<\/a>’, eachLine)
    if info is not None:
        print info.group(1)

运行:

lihui@LastWish $ python crawler.py
LINUX
NETWORK
PERFORMANCE
PERL
PYTHON
WEB
生活
音乐

搞定~!

将urlopen要爬的URL换一个,改成同学的http://http://www.wanbim.com/blog,照样OK~!

lihui@LastWish $ python crawler.py
css
html
javascript
javascript-BOM
jquery
杂谈

发表回复