对于python软件爬取网页数据,一般采用BeautifulSoup库或者Xpath技术来解析html,然后寻找爬取对象的网页路径来定位所需数据,进而利用循环条件来不断获取数据。另外,也可以使用Scrapy框架来爬取。对于上述软件包或库,在进行网页爬虫时需要安装相关库并导入,而Scrapy框架目前windows系统下python3软件还不一定安装不了。在这里介绍一种单纯使用find()函数来爬取数据的方法,它不需要安装和导入上述Python库,仅仅依靠读取网页之后形成的代码文档,通过定位爬取对象的位置及范围,来获得所需数据。在这里为了简单介绍一下这一方法,本文以最近上映大片——张艺谋导演的《长城》电影,其豆瓣短评的第一页为例(长城 短评**),爬取每一个短评。
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,可以看到每个短评处于<p class=""> </p>之间,那么就可以使用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往前一位,如图:
![](https://pic3.zhimg.com/v2-3d1413adb960687a23935a99e01630fe_b.png)但是如果单纯依靠strip()来去除标点符号等,还会出现错误,比如有人用手机发帖,在<p class=""> </p>之间还会有如下字符:
![](https://pic1.zhimg.com/v2-972d482565ae4c0130c418a1fd1b478c_b.png)因此,在这里先用split截取第一个字段,再strip().
最终打印,得到第一页所有短评文字。对于多网页的抓取则可以再使用while循环,结合每个网页的特点,运用page = page + 1来不断抓取。在此基础上,设置一定的停止条件,就爬到了对《长城》这一电影所有短评。然后我们就可以进行分析大家对《长城》这部电影的关注点、吐糟点等等,采用词频分析,文本挖掘以及词云等来进行数据分析。