python爬虫之单纯用find()函数来爬取数据

浏览: 1574

作者:博观厚积

链接:https://www.jianshu.com/p/f11dc0c7bf52

來源:简书


对于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,可以看到每个短评处于<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来不断抓取。在此基础上,设置一定的停止条件,就爬到了对《长城》这一电影所有短评。然后我们就可以进行分析大家对《长城》这部电影的关注点、吐糟点等等,采用词频分析,文本挖掘以及词云等来进行数据分析。

推荐 1
本文由 Python爱好者社区 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册