对于python软件爬取网页数据,一般采用BeautifulSoup库或者Xpath技术来解析html,然后寻找爬取对象的网页路径来定位所需数据,进而利用循环条件来不断获取数据。另外,也可以使用Scrapy框架来爬取。对于上述软件包或库,在进行网页爬虫时需要安装相关库并导入,而Scrapy框架目前windows系统下python3软件还不一定安装不了。
在这里介绍一种单纯使用find()函数来爬取数据的方法,它不需要安装和导入上述Python库,仅仅依靠读取网页之后形成的代码文档,通过定位爬取对象的位置及范围,来获得所需数据。在这里为了简单介绍一下这一方法,本文以最近上映大片——张艺谋导演的《长城》电影,其豆瓣短评的第一页为例(长城 短评),爬取每一个短评。
首先,导入urllib库,打开url网址并读取为utf-8格式
import urllib.request
req = urllib.request.urlopen('https://movie.douban.com/subject/6982558/comments?sort=new_score&status=P')
txt = req.read().decode('utf-8')
print(txt)
通过打印txt,可以看到每个短评处于
之间,那么就可以使用find函数来找到这两个参数第一次出现的开头位置。
words = txt.find(r'p class=""')
wordsend = txt.find(r'/p',words) #缩小范围,在words位置范围内寻找/p
其中,wordsend就在从第一个words出现的位置,这也能做可以缩小搜寻范围。
接下来就是存储第一个短评,并形成循环将该网页的其他短评也依次找到并存储。
com=[]
i =0
while words !=-1 and wordsend !=-1 :
com1 = txt[words +11:wordsend-1].split(' ')[0].strip()#将第一个评论储存起来
com.append(com1)
words = txt.find(r'p class=""',wordsend) #从上一个wordsend开始寻找下一个p class
wordsend = txt.find(r'/p', words)
i = i + 1
else:
print('the end!')
print(com)
在这里需要特别说明的就是,com1 = txt[words +11:wordsend-1].split(' ')[0].strip(),其中
txt[words +11:wordsend-1]就是网页txt文档中第一条短评的前后位置范围找到再提取出来,其中短评最开始的位置就是words变量中p class=""的p开始数字符串,第11位,结束位置则是wordsend中/p往前一位,如图:
但是如果单纯依靠strip()来去除标点符号等,还会出现错误,比如有人用手机发帖,在
之间还会有如下字符:
因此,在这里先用split截取第一个字段,再strip().
最终打印,得到第一页所有短评文字。对于多网页的抓取则可以再使用while循环,结合每个网页的特点,运用page = page + 1来不断抓取。在此基础上,设置一定的停止条件,就爬到了对《长城》这一电影所有短评。然后我们就可以进行分析大家对《长城》这部电影的关注点、吐糟点等等,采用词频分析,文本挖掘以及词云等来进行数据分析。
最后,说一下,这种方法需要对爬取对象的精准定位,否则定位不准或者网页中有其他数据类似定位的话,就会导致失败。因此,不像BeautifulSoup库或者Xpath技术在定位上这么清晰明白。