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

科学计算与大数据

浏览数:210

2019-2-21

AD:资源代下载服务

当你在知乎上搜索“王宝强”时候,搜索结果页面的底部有个“更多”按钮,如下图

遇到这个坑爹了,因为你发现点击“更多”按钮后,网址部分没有变化,但页面却加载了新的数据。怎么办????

没法按照之前的 有规律的网址&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()

代码在我这里运行成功,不过在你那里需要注意拷贝代码后,要调整代码,因为有的代码一行太长了,被知乎调整到第二行了,这样可能会出错。

该方法缺点是运行速度慢,不过对于小数据需求的小白们来说,还是可以接受的。

———————————-

作者:邓旭东

博客专栏:邓旭东HIT的博客专栏

欢迎关注 简书账号 邓旭东HIT

知乎: 邓旭东HIT
微信公众号: 大邓带你玩转python

大家也可以加小编微信:tszhihu (备注:Python),拉大家到 Python爱好者社区 微信群,可以跟邓旭东、崔庆才等老师互相交流。谢谢