本文共 2699 字,大约阅读时间需要 8 分钟。
(*---封面图片是2020春夏之交拍的,彼时风光明媚,现在2020年的岁末,在这种清冷之中偶然瞥见,不禁为岁月的流逝和季节的巡回而动容,记忆带我时空错落了---*)
——133号——
为了分析的目的,有时候需要了解公众对特定问题或现象的看法,一种可行的方案是从新浪微博上,抓取特定文章所引起的公众讨论信息。微博有三种显示页面,其中移动端的显示页面最为简单,浏览起来不是很方便,但却是最容易利用Python爬虫抓取数据的。 移动端网址:https://weibo.cn/ 界面显示为: 下面就以“人民日报”发布的某一条微博为案例,抓取该微博下面的评论。打开该微博的评论列表,并分析列表的url特征,用于连续爬取翻页数据: https://weibo.cn/comment/hot/It6vvtD94?rl=1&oid=4470428665664743&page=1 https://weibo.cn/comment/hot/It6vvtD94?rl=1&oid=4470428665664743&page=2 …… 从上面就可以看出,通过url末尾的page=1(2,3,4……)实现翻页,基于这个特征就可以构建一个循环,连续爬取页面了,代码为:urls = ['https://weibo.cn/comment/hot/It6vvtD94?rl=1&oid=4470428665664743&page={}'.format(str(i)) for i in range(1,4)]
这里设置了4次循环,即for i in range(1,4),format(str(i))会将i转化为字符串传递到前面的{}中,从而构建出每一个页面的url,爬取时只需要从url里面依次读取每一个url就可以了。
当然,在打开移动端页面时,还需要登录,输入自己的用户名和密码,后面我们就可以通过“检查”页面,在“Network”里面刷新页面,选择“ALL/XHR/JS/CSS……”等,在headers里面的request headers里面,获取到自己浏览器的user-agent、authority、accept、accept-language、cookie等信息,这里面尤其以user-agent和cookie最为重要,如下图所示: 下面就是利用Python编写的抓取页面评论的程序:#载入需要用到的库import requestsfrom bs4 import BeautifulSoupimport timeimport pandas as pd#构建模型浏览器的headersheaders={ 'User-agent':'粘贴自己浏览器的user-agent', 'authority':'weibo.cn', 'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9', 'Accept-Language':'zh-CN,zh;q=0.9', 'Accept-Encoding':'gzip,deflate,br', 'Cookie':'粘贴自己浏览器的cookie', 'DNT':'1', 'Connection':'keep-alive'}urls = ['https://weibo.cn/comment/hot/It6vvtD94?rl=1&oid=4470428665664743&page={}'.format(str(i)) for i in range(1,4)]#定义两个存储日期和评论的列表datelist,commentlist=[],[]page=0#从urls中依次读取每一个url,然后爬取,并将内容存储在两个列表中for url in urls: page=page+1 print("***准备爬取第{}页,网址为:".format(page),url) wb_data=requests.get(url,headers=headers) #print(wb_data.status_code) soup = BeautifulSoup(wb_data.text, 'lxml') comments = soup.select('span.ctt') dates=soup.select('span.ct') #提取我们需要的数据 for date,comment in zip(dates,comments): datelist.append(date.get_text().split(' ')[0]) commentlist.append(comment.get_text()) print("【日期】",date.get_text().split(' ')[0],"\n【评论】",comment.get_text()) #暂停3秒后再进行下一个循环,免得被察觉封号 time.sleep(3)#将列表里面的内容写入到csv数据库中result1 = pd.DataFrame({ "date": datelist, "comment": commentlist}, columns=['date', 'comment'])result1.to_csv("weibo.csv", index=False)
上面代码运行的结果存储在weibo.csv这个数据文件里面,并在pycharm里面显示爬取的进度情况,如下图:
上面的代码存在的一个问题是,不能爬取评论下面的二级评论,在移动端的页面上,我也没有找到二级评论的入口。不过每一个页面显示10条评论,总共14601页,似乎所有的页面就可以穷尽所有的评论了。
移动端存在的另一个问题是,当翻页到一定的程度后,比如到150页的时候,后面再新翻的页面显示的内容居然是一样的,不知道这个问题出在什么地方。这个问题,希望后面在学习爬取手机端之后可以得到解决,就留待下次再总结吧。
~End~转载地址:http://yfudy.baihongyu.com/