博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
select 移动端 第一个无法选中_Python爬虫微博(移动端)评论
阅读量:1533 次
发布时间: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/

你可能感兴趣的文章
springboot集成springsecurity 使用OAUTH2做权限管理
查看>>
@ExceptionHandler不管用 spring security oauth2 自定义异常拦截InternalAuthenticationServiceException
查看>>
java static静态块,普通块,静态属性,内部类,内部静态类,内部子类,构造块,辨析与实例初始化执行顺序
查看>>
使用spring的异步模式@EnableAsync与@Async配合Future与AsyncResult实现异步调用服务并行,也可以并行sql查询加速系统
查看>>
完全看懂CAS之JDK并发包JUC里cas使用volatile变量自旋的乐观锁模式解决多线程单变量同步问题与CAS缺点ABA资源消耗
查看>>
ReentrantLock与Condition实现生产者消费者,模拟延时用LockSupport.parkNanos
查看>>
复习Java类与对象&Java字符串面试题&生活【记录一个咸鱼大学生三个月的奋进生活】003
查看>>
复习Java封装继承&Java异常抛出面试题&生活【记录一个咸鱼大学生三个月的奋进生活】004
查看>>
复习Java多态&Java面试题==和equals区别&测试用例模板&生活【记录一个咸鱼大学生三个月的奋进生活】005
查看>>
复习Java抽象和接口&Java面试题Redis&生活【记录一个咸鱼大学生三个月的奋进生活】006
查看>>
复习Java.Lang包&Java面试题Vector、ArrayList、LinkedList区别&生活【记录一个咸鱼大学生三个月的奋进生活】007
查看>>
复习Java异常处理&Java面试题List和Set的区别,Array和ArrayList的区别&生活【记录一个咸鱼大学生三个月的奋进生活】008
查看>>
复习Java的JDBC&Java面试题数据库索引&生活【记录一个咸鱼大学生三个月的奋进生活】009
查看>>
复习Java时间相关类(案例:万年历)&Java面试题数据库如何优化&生活【记录一个咸鱼大学生三个月的奋进生活】010
查看>>
复习Java集合框架&Java面试题数据库如何分库分表&生活【记录一个咸鱼大学生三个月的奋进生活】011
查看>>
复习Java图形界面swing&Java面试题数据库删除数据的方法&生活【记录一个咸鱼大学生三个月的奋进生活】012
查看>>
复习Java第一个项目学生信息管理系统 01(界面部分) &Java面试题抽象类和接口&生活【记录一个咸鱼大学生三个月的奋进生活】013
查看>>
复习Java第一个项目学生信息管理系统 03(model层Dao功能接口部分) &Java面试题序列化知识&生活【记录一个咸鱼大学生三个月的奋进生活】015
查看>>
实现选中子节点不关联父节点,选中父节点选中子节点
查看>>
MYSQL-datatime和timestamp的区别
查看>>