使用Selenium简单收集知乎的话题数据

发表于:2017-3-21 10:51

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:邓旭东    来源:51Testing软件测试网采编

  当你在知乎上搜索“王宝强”时候,搜索结果页面的底部有个“更多”按钮,如下图
  遇到这个坑爹了,因为你发现点击“更多”按钮后,网址部分没有变化,但页面却加载了新的数据。怎么办????
  没法按照之前的 有规律的网址&page=number ,通过for循环依次遍历网页。
  在这里我不讲抓包,分析请求包。咱们就用生硬的方法,破解这问题。在这里我使用了selenium库,并且要安装一个火狐浏览器(firefox36)。轻松破解该问题。
  selenium教程,建议大家网上买《selenium 2自动化测试实战-基于python语言》 这本书阅读相关知识。当然也可以根据本代码,在网上查相关selenium的知识。
import re
import csv
import time
import urllib.parse as parse
from selenium import webdriver
from bs4 import BeautifulSoup
# keyword话题名 ,filename保存数据的文件名,page_num收集多少页
def topic_title_spider(keyword='王宝强', filename = 'wangbaoqiang', page_num = 10):
start = time.time()
# 建立一个收集数据的csv文件
csvFile = open(r'E:\%s.csv'% filename, 'a+', newline='')
writer = csv.writer(csvFile)
writer.writerow(('title', 'review_num'))
# 将关键词转换为十六进制格式,填入到链接中
kw = parse.quote(keyword)
driver = webdriver.Firefox()
driver.get('https://www.zhihu.com/search?type=content&q=%s' % kw)
# 正则表达式,用来匹配标题,评论数
reg_title = re.compile(r'<a class="js-title-link" href=.*?" target="_blank">(.*?)</a>')
reg_li = re.compile(r'item clearfix.*?')
reg_num = re.compile(r'<a class="zm-item-vote-count hidden-expanded js-expand js-vote-count" data-bind-votecount="">(.*?)</a>')
# 先循环点击页面底部“更多”,加载尽可能多的页面数据
for i in range(1, page_num, 1):
driver.find_element_by_link_text("更多").click()
duration = time.time()-start
print('%s小爬虫 已经跑到 第%d页 了,运行时间%.2f秒,好累啊'%(keyword, i, duration))
time.sleep(5)
soup = BeautifulSoup(driver.page_source, 'lxml')
li_s = soup.find_all('li', {'class': reg_li})
for li in li_s:
li = str(li)
try:
title = re.findall(reg_title, li)[0]
title = title.replace('<em>', '')
title = title.replace('</em>', '')
review_num = re.findall(reg_num, li)[0]
except:
continue
writer.writerow((title, review_num))
print(title, review_num)
csvFile.close()
driver.quit()
  代码在我这里运行成功,不过在你那里需要注意拷贝代码后,要调整代码,因为有的代码一行太长了,被知乎调整到第二行了,这样可能会出错。
  该方法缺点是运行速度慢,不过对于小数据需求的小白们来说,还是可以接受的。
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号