专栏名称: 51Testing软件测试网
51Testing软件测试网,人气最旺的软件测试技术门户,提供软件测试社区交流,软件测试博客,人才服务,测试沙龙,测试杂志,测试资料下载等全方位信息服务,是国内最专业的软件测试就业培训、企业服务供应商...
目录
相关文章推荐
51好读  ›  专栏  ›  51Testing软件测试网

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

51Testing软件测试网  · 公众号  · 测试  · 2017-03-27 17:30

正文


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

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

没法按照之前的 有规律的网址&page=number ,通过for循环依次遍历网页。

在这里我不讲抓包,分析请求包。咱们就用生硬的方法,破解这问题。在这里我使用了selenium库,并且要安装一个火狐浏览器(firefox36)。轻松破解该问题。

Selenium教程,建议大家网上可以去51Testing软件测试网查看Selenium的测试专题。当然也可以根据本代码,在网上查相关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' (.*?) ')

reg_li = re.compile(r'item clearfix.*?')

reg_num = re.compile(r' (.*?) ')

# 先循环点击页面底部“更多”,加载尽可能多的页面数据

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(' ', '')

title = title.replace('', '')

review_num = re.findall(reg_num, li)[0]

except:

continue

writer.writerow((title, review_num))

print(title, review_num)

csvFile.close()

driver.quit()

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

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

推荐阅读

点击阅读☞ 自动化测试工具Webdriver入门解析

点击阅读☞ 使用Selenium找出外卖点餐次数最多的10个顾客







请到「今天看啥」查看全文