web scraping with python
之前就有对网络爬虫很感兴趣,觉得这是一件比较有意思的事情,奈何前段时间有接触过,学到后面的时候有点吃力,总结了一下原因之后觉得最直接的原因就是在前端方面自己接触的还是太少了,现在在准备论文之余。。。(为何总对论文的内容不感兴趣呢-_-!)再来重新看一遍爬虫吧。。哈哈,突然觉得保持一整天学习的热情的秘诀就是:
***把每一天的早晨的时间都用在自己感兴趣的事情上。***好了,进入正题,直接来看代码:
1 | from urllib.request import urlopen |
首先是引入几个需要用到的库,request
中的urlopen
,beautifulsoup
,是爬虫经常需要用到的库(这里代码中的BeautifulSoup
是BeautifulSoup
库中的BeautifulSoup
对象,不是指的BeautifulSoup
库),前者是自带的,能够直接获取网页中的html
代码,而后者是第三方库,需要自己安装,他是用来转换我们得到的html
代码的结构,使其能够只要目标信息的旁边或附近有标记(这里说的标记是HTML
中的标记)我们就能够提取出来。HTTPError
和URLError
则是对异常的处理所需要的。
我们这里首先定义了一个名为getTitle
的函数。我们在进行这个语句的时候:html=urlopen("http://aisleep.xyz")
这行代码可能会发生两种异常:1、网页不在服务器上;2、服务器不存在。发生第一种异常,程序会抛出HTTpError
异常,发生第二种异常,程序会返回一个None
对象。所以getTitle
函数中的第一个异常处理针对于HTTPError
,还增加了一个防止url
地址输入错误引起的URLError
。
然后,我们在使用BeautifulSoup
去提取我们所需要的信息时也会出错:如果我们想要调用的标签不存在,BeautifulSoup
会返回一个None
对象;如果再去调用这个None
对象下面的子标签,还会发生AttributeError
错误。
所以第二个异常处理针对于:1、因为服务器不存在而返回一个None
值,后再调用这个None
值(通过html.read()
调用)引起的AttributeError
异常。2、因为我们使用BeautifulSoup
调用一个不存在的标签的时候返回了一个None
值,后再调用这个None
值下面的子标签而造成的AttributeError
异常。
针对于爬虫中比较常见的异常处理,这样一来就会很简单的使自己的代码更稳定一点。
上面的是采集一个页面中需要的信息,下面再看一个代码,实现随机的从一个页面跳转到另一个页面:
1 | from urllib.request import urlopen |
首先这里导入了一些需要的库,datetime
和random
分别是为了生成一个随机数生成器。第7行中就是通过当前时间为值实现了一个随机数生成器。接着定义了一个函数getLitle
我们传入的是以http://en.wikipedia.org
为开头的url
然后传入Beautifulsoup
,最后返回在当前网页(用的是find
)中的在div
标签下的id
是bodyContent
的,且不包含:
的以/wiki/
开头的所有url
链接(返回的是一个列表,这里用了正则表达式来匹配所要满足条件的链接)。
第14行写到以Kevin_Bacon
为开始页面,调用getLinks
函数。16行往下是指在返回的列表不为空的情况下,以随机数生成器生成的随机数作为列表的序号,去访问另一个链接,跳转到另一个页面,打印这个链接,最后又将此链接传给getLitle
函数。
接下面再看一个代码:
1 | from urllib.request import urlopen |
由于链接之间很多都是重复的,所以自然就会有需要“链接去重”的功能。
首先定义了一个set
集合类型的变量pages
,接着我们看getLinks
函数,第7行是定义全局变量pages
,然后找到以/wiki/
开头的链接。第12行是判断这个链接是否在pages
中,如果不在就说明是新链接,打印且将他增加到pages
中,最后将这个newPage
又传入getLinks
函数,递归处理。