上一篇爬虫,真心慢,所以一直想研究一个新的方法,但对于我这种半路出家,只有一点Python基础就去自学爬虫的人来说,找一种新的方法是在有难度。
原本是想放下之前的所学,然后从新跟着《Python网络数据采集》来系统学习的,但是我发现自己实在静不下来
最后只好在之前的一条岔路上,继续走,看看能不能优化一下爬虫

系统学Python爬虫的都知道,bs4中的beautiful是很好用的一个爬虫方法,但其实webdriver中也有类似的方法

html = driver.page_source

这种方式也是会获取到整个页面源码,如果你print html一下,你会发现,咻的一声,页面源码全部出来

获取了全部的页面源码,那么我们就可以通过re里面的findall找出我们需要的信息咯(这个会把回复的评论也找出来)

此时此刻,先自问一下正则表达式学得怎么样,学得不太好的话,最好先去看看,了解了解基本逻辑

#昵称、链接、ID
html_list = re.findall('<a\s*target="_blank"\s*href="//weibo.com/[a-z0-9A-Z]*"\s*usercard="id=[0-9]*">.*?</a>',html,re.S)#评论日期、时间time_list = re.findall('<div\s*class="WB_from.S_txt2".{0,20}?div>',html,re.S)#评论内容
comment_list = re.findall(u'</a>(?:\s*<i\s.*?></i>)?[\uff1a].*?</div>',html,re.S)

我详细说一下我用到的那3段正则表达式


第一段

html_list = re.findall('<a\s*target="_blank"\s*href="//weibo.com/[a-z0-9A-Z]*"\s*usercard="id=[0-9]*">.*?</a>',html,re.S)

其实通过开发者工具,我们都能看到,在一条评论中的的用户名字是包含了链接、ID以及昵称。
链接的组成是 href="//weibo.com/********" ,其中 * 的组成绝大部分都是数字,但是少数微博用户的是英文或者英文+数字
ID的组成是 usercard=“id=**********” ,其中 * 的组成为数字,至于位数一般为10位
昵称的组成其实是处于 <a></a> 之间的,作为微博(QQ微信等)的使用者,我们知道昵称的组成真的是“多姿多彩”的,所以我们过于强求把整个昵称(有些昵称可能包含了图片,虽然我不理解为什么可以这样命名)截取出来,我们只需要把其中的文字、数字字符截取就好
前面的re.findall就不说了,这是Python中re库的内置函数,具体的功能是寻找所有符合条件的源码
重点说一下中间的正则表达式
\s:不可见的字符,包括空格、换行符等等
*:0-无穷个
\s*:0-无穷个空格(换行符等)
[a-z0-9A-Z] :一个属于a-z或0-9或A-Z的字符
[a-z0-9A-Z]*:由0-无穷个属于a-z或0-9或A-Z的字符组成的字符串
[0-9]*:由0-无穷个属于0-9的字符组成的字符串
.:匹配除去换行符与回车符的任意一个字符
?:非贪婪匹配模式(可以理解为尽可能少的进行匹配,因为页面源码存在多个 </a> ,若使用贪婪匹配,会导致出一个开头为 <a**>,结尾为 </a> 的结果,中间存在多个<a></a>)
.*?:由0-无穷个字符组成字符串(非贪婪模式匹配,且不包含换行符及回车符)


第二段

time_list = re.findall('<div\s*class="WB_from.S_txt2".{0,20}?div>',html,re.S)

这是爬取时间用的正则表达式
从开发者工具我们可以看到所有的时间都是记录在 <div****>****</div> 里面的
这里只有一个新的正则表达式
.{0,20}?:其实和 .*? 的原理是差不多的,只是把 * 换成了 {0,20} ,就是把任意字符(不包含换行符回车符)非贪婪模式下匹配0-20次,也就是匹配一段长度为0-20之间的字符串


第三段

comment_list = re.findall(u'</a>(?:\s*<i\s.*?></i>)?[\uff1a].*?</div>',html,re.S)

这是爬评论的正则表达式,也是我自己都不确定是否已经完善的正则表达式(其实我的工作对这部分的要求并不大,但是本人有点完美主义,原本能爬的这部分,感觉不爬不舒服)
首先我们要了解我们需要爬取的评论形式以及评论的实际形式
一般我们需要的评论都是文字型的,因为文字型评论具有分词意义,当然有些可能需要图片型,但此处不作议论
微博的评论(其实不止微博)其实多种多样,有文字的,有图片的,有表情的等等
从开发者工具我们可以看到一般文字(包含英文数字中午及字符)评论都会存在于 > 和 < 之间,然后文字之间或者前后可能会穿插着图片 <img> ,这部分其实我们不需要,但截取的时候也不得不将其截取下来
经过细心的观察其实我们可以发现其实所有的评论(无论文字还是图片表情)其实都包含在 </a> 和 </div> 之间,但我们将这中间所有的字符通过非贪婪模式进行匹配,就可以把评论截取出来了
说说这段的正则表达式
(?:tem):非获取匹配,匹配tem但不获取结果,等待全部匹配结束后输出整个结果(why need?①)
[\uff1a]:中文符号中的引号“:”
①:目前发现在微博中的评论有一种叫做“微博监督员”的图标,这个图标的会影响到我们的匹配,因为它是介于 </a> 和引号:之间的,所以我们只能用这样的方式将其匹配出来,若有怎一并匹配,若无则跳过匹配。


接下来就是数据的整理了

res_list=[]
for i in range(len(html_list)):tem=[]tem_htm=html_list[i].split()[2].split('"')[1]tem_ID=html_list[i].split()[3].split('"')[1].split("=")[1]tem_name=html_list[i].split()[3].split('"')[2][1:(len(html_list[i].split()[3].split('"')[2]))-4]tem_comment=re.sub('<.*?>','',comment_list[i])[1:]try:tem_date=time_list[i].split(">")[1].split("<")[0].split()[0]tem_time=time_list[i].split(">")[1].split("<")[0].split()[1]except:tem_date=Date_Timetem_time=time_list[i].split(">")[1].split("<")[0]tem.append(tem_name)tem.append(tem_ID)tem.append("https:"+tem_htm)tem.append(tem_comment)tem.append(tem_date)tem.append(tem_time)res_list.append(tem)

这段代码挺简单的,只有一个需要注意的函数
“re.sub”
这是用来删除符合条件(正则表达式)的字符串,我这里是把所有 <**> 的内容通过非贪婪模式进行匹配并删除,这样就可以将评论中的图片表情图标等等都删除掉(包括前面的 </a> 和后面的 </div> )




最后的最后,附上所有的代码

from selenium import webdriver
import time
import re
import xlrd
import pandas as pdfname=u"C:\\Users\\Administrator\\Desktop\***.xlsx"
bk=xlrd.open_workbook(fname)
x1=pd.ExcelFile(fname)#打开并读取文件内容
sh=bk.sheet_by_name(x1.sheet_names[0])#获取第一个sheet的内容
URL_list=[]
for i in range(sh.nrows-1):URL_list.append(sh.cell(i+1,0).value)js="var q=document.documentElement.scrollTop=100000"res_PL = []
k = 0
for url in URL_list:driver = webdriver.Firefox()driver.get(url)time.sleep(10)Date_Time=time.strftime("%Y/%m/%d %H:%M:%S")#将页面拖到底部for i in range(5):driver.execute_script(js)time.sleep(2)#查看更多直至全部显示for i in range(10):while (1):try: driver.find_element_by_class_name("more_txt").click()time.sleep(0.8)except:breaktime.sleep(2)html = driver.page_source#昵称、链接、IDhtml_list = re.findall('<a\s*target="_blank"\s*href="//weibo.com/[a-z0-9A-Z]*"\s*usercard="id=[0-9]*">.*?</a>',html,re.S)#评论日期、时间time_list = re.findall('<div\s*class="WB_from.S_txt2".{0,20}?div>',html,re.S)#评论内容comment_list = re.findall(u'</a>(?:\s*<i\s.*?></i>)?[\uff1a].*?</div>',html,re.S)res_list=[]for i in range(len(html_list)):tem=[]tem_htm=html_list[i].split()[2].split('"')[1]tem_ID=html_list[i].split()[3].split('"')[1].split("=")[1]tem_name=html_list[i].split()[3].split('"')[2][1:(len(html_list[i].split()[3].split('"')[2]))-4]tem_comment=re.sub('<.*?>','',comment_list[i])[1:]try:tem_date=time_list[i].split(">")[1].split("<")[0].split()[0]tem_time=time_list[i].split(">")[1].split("<")[0].split()[1]except:tem_date=Date_Timetem_time=time_list[i].split(">")[1].split("<")[0]tem.append(tem_name)tem.append(tem_ID)tem.append("https:"+tem_htm)tem.append(tem_comment)tem.append(tem_date)tem.append(tem_time)res_list.append(tem)res_PL.append(res_list)k=k+len(res_list)print u"该链接"+str(len(res_list))+u"条评论已爬完,共爬"+str(k)+u"条评论"driver.quit()import xlwt
filename=xlwt.Workbook(encoding='utf-8')#建立存储数据中转数据集
sheet=filename.add_sheet("res")#对sheet进行命名zh=0#除去第一行已写入数据
for i in range(len(res_PL)):for j in range(len(res_PL[i])):#分别for循环行数for k in range(len(res_PL[i][j])):#分别for循环列数sheet.write(zh,k,res_PL[i][j][k])#数据写入zh+=1
#保存excel文件filename.save("C:\\Users\\Administrator\\Desktop\\res.xls")

其余没做解释的代码可以参考我上一篇的爬虫或者是自己百度

亲测,爬虫速度快了很多,影响到你爬虫速度基本就是你自己的网速了

欢迎交流,有疑问请留言

Python笔记--菜鸟爬虫(爬微博评论)②相关推荐

  1. Python笔记--菜鸟爬虫(爬微博评论)

    第一次爬虫就是爬微博的评论(爬虫-只要能看就能爬) 准备工作: Python2.7(看个人习惯).FireFox浏览器(看个人习惯) Python安装什么的网上一大堆教程,我不班门弄斧了 FireFo ...

  2. python爬取微博评论点赞数_python 爬虫 爬微博 分析 数据

    python 爬虫 爬微博分析 数据 最近刚看完爱情公寓5,里面的大力也太好看了吧... 打开成果的微博,小作文一样的微博看着也太爽了吧... 来 用python分析分析 狗哥这几年微博的干了些啥. ...

  3. python + selenium +pyquery 爬虫 爬取 1688详情图片 阿里巴巴详情图片 与标题 下载图片并进行压缩

    python + selenium +pyquery 爬虫  爬取 1688详情图片 阿里巴巴详情图片 与标题 下载图片并进行压缩 用到的库和源码下载地址 需要用到chromedriver  包含wi ...

  4. python简单网站爬虫-爬取北京7天最高、最低气温

    python简单网站爬虫-爬取北京7天最高.最低气温 前置操作: 1.待爬取网站: 北京天气的网址: http://www.weather.com.cn/weather1d/101010100.sht ...

  5. python微博评论爬虫_详解用python写网络爬虫-爬取新浪微博评论 基于Python的新浪微博爬虫研究...

    怎样爬取新浪微博的评论信息 针对八爪鱼在微博的应用上,除了用户信息之外还包括话题内容方面的采集,目前绝大多数企业均在微博设有官方微博,八爪鱼可以协助企业快速及时的抓取与企业产品相关联的话题信息,规则市 ...

  6. python爬取微博恶评_详解用python写网络爬虫-爬取新浪微博评论

    新浪微博需要登录才能爬取,这里使用m.weibo.cn这个移动端网站即可实现简化操作,用这个访问可以直接得到的微博id. 分析新浪微博的评论获取方式得知,其采用动态加载.所以使用json模块解析jso ...

  7. python爬虫 爬取评论区

    在做课题的时候老师给了一个建议:去找找非结构化数据. 说实话我们连结构化数据都整不明白,还妄想尝试处理非结构化数据,于是尝试爬取了一下微博评论区.    讲太多会被墙审核不通过 先理解一个叫做开发者界 ...

  8. 用python写网络爬虫-爬取新浪微博评论

    新浪微博需要登录才能爬取,这里使用m.weibo.cn这个移动端网站即可实现简化操作,用这个访问可以直接得到的微博id. 分析新浪微博的评论获取方式得知,其采用动态加载.所以使用json模块解析jso ...

  9. python豆瓣爬虫爬取评论做成词云

    前言 前一段时间学校有个project,做一个电影购票系统,当时就用springboot做了系统,用python抓了一些电影的基本信息.后来发现如果把评论做成词云那展示起来不是很酷炫么.于是乎把这个过 ...

最新文章

  1. Day3-python基础3
  2. 30 | 套路篇:如何迅速分析出系统I/O的瓶颈在哪里?
  3. mp4格式文件转码后处理(qt-faststart工具介绍)
  4. Java小白进阶笔记(3)-初级面向对象
  5. 不为失败找理由,只为成功找方法
  6. 取消vs2013在代码中的Reference数量功能
  7. 帆软报表多行多条数据写入表_超多种类的报表模板,填上数据就能用,全拿走!...
  8. pyqt5 qwidget有父类窗口如何设置模态_实战PyQt5: 024-Qt Designer进阶一
  9. 编程算法题:101个数字,[1,100]中有一个是重复的,找出这个重复的数字。
  10. 利用自定义注解,统计方法执行时间
  11. 英文斜体复制_斜体英文转换器,斜体英文26个字母可复制
  12. 使用Wifi pineapple(菠萝派)进行Wi-Fi钓鱼攻击
  13. 打造个人的云技术乐园
  14. 2022年度“十大基础研究关键词”在深发布
  15. SwiftUI应用开屏广告界面项目(一)
  16. Python 竟然不是最赚钱的编程语言?!
  17. Kali Linux渗透测试实战 第一章
  18. PIC以太网开发板——基于微芯最新ENC28J60以太网控制器
  19. CSS Grid 和 Flexbox
  20. EasyExcel导出自动适应列宽 Excel样式

热门文章

  1. php yaf框架模块化,YAF框架组成部分
  2. AI和工业4.0之间,还有多远的差距?
  3. HorizontalLayoutGroup用法
  4. kali系统的u盘安装过程_Kali Linux安装U盘启动并持久化
  5. 单点登录,不要老盯着cas-server了,你还可以选择keycloak
  6. rockchip uboot kernel logo制作方法
  7. 解决kali访问HackTheBox网络不稳定
  8. 本地连接VMware Workstation 虚拟机
  9. android studio 首次安装报 Unable to access Android SDK add-on list 错误
  10. 写给 MySQL 开发者的 TDengine 入门指南