博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
select 移动端 第一个无法选中_Python爬虫微博(移动端)评论
阅读量:1534 次
发布时间:2019-04-21

本文共 2699 字,大约阅读时间需要 8 分钟。

ae05b313c3443d2f4b3d03629864c5c6.gif

(*---封面图片是2020春夏之交拍的,彼时风光明媚,现在2020年的岁末,在这种清冷之中偶然瞥见,不禁为岁月的流逝和季节的巡回而动容,记忆带我时空错落了---*)

——133号——

为了分析的目的,有时候需要了解公众对特定问题或现象的看法,一种可行的方案是从新浪微博上,抓取特定文章所引起的公众讨论信息。微博有三种显示页面,其中移动端的显示页面最为简单,浏览起来不是很方便,但却是最容易利用Python爬虫抓取数据的。 移动端网址:https://weibo.cn/ 界面显示为:

d581a1ffff4156288ccfda1dcc2f491c.png

下面就以“人民日报”发布的某一条微博为案例,抓取该微博下面的评论。打开该微博的评论列表,并分析列表的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最为重要,如下图所示:

10ac96f772c61cb6dbf73a1362a55f5c.png

下面就是利用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里面显示爬取的进度情况,如下图:

cf1819eaa498a3190da9986d8404137b.png

上面的代码存在的一个问题是,不能爬取评论下面的二级评论,在移动端的页面上,我也没有找到二级评论的入口。不过每一个页面显示10条评论,总共14601页,似乎所有的页面就可以穷尽所有的评论了。

移动端存在的另一个问题是,当翻页到一定的程度后,比如到150页的时候,后面再新翻的页面显示的内容居然是一样的,不知道这个问题出在什么地方。这个问题,希望后面在学习爬取手机端之后可以得到解决,就留待下次再总结吧。

~End~

c3fdb90ff6d9f194a04f76725b2d0301.png

转载地址:http://yfudy.baihongyu.com/

你可能感兴趣的文章
MAC sublime text 无法自动补齐标签
查看>>
NgBook留言本开发全过程(1)
查看>>
LeetCode-指针法
查看>>
Python之路,Day12 - 那就做个堡垒机吧
查看>>
linux之shell之if、while、for语句介绍
查看>>
Mysql phpStudy升级Mysql版本,流产了怎么办?
查看>>
SQLServer之数据库行锁
查看>>
OFDM仿真
查看>>
代理模式
查看>>
AC日记——背包问题 V2 51nod 1086
查看>>
CSS关键字
查看>>
UIAlertView
查看>>
nodejs supervisor
查看>>
jq 笔记
查看>>
【Pthon入门学习】利用slice实现str的strip函数,类似C#中的string.trim
查看>>
python3执行js之pyexecjs
查看>>
7.6 内联函数 inline
查看>>
服务端签名后直传OSS
查看>>
1453 统计素数个数 2
查看>>
cogs 358. [SDOI2012] 体育课
查看>>