1.简介
今天实验室给了任务,爬取蚂蜂窝上的中国国家博物馆的评论。一开始,我以为简单的request加bs4就给解决了。没想到request后结果如下:竟然没有内容。
没想到request后结果如下:竟然没有内容!!!查了资料后,得知这是ajax网页,决定用selenium爬取。
2.Selenium介绍
Selenium是一个自动化测试模块,我这里不多介绍,如有兴趣,可以参考别人的资料学习。
在爬虫中,主要用到webdriver子模块来模拟浏览器活动,这样既可以获取内容,也具有一定的反反爬虫效果(对,就是这么绕口!)
下面来简单看下selenium如何使用
# 初始化
driver = webdriver.Safari()
# 请求网页
driver.get(url)
# 最大化浏览器窗口
driver.maximize_window()
# 查找元素
button = driver.find_element_by_xpath("//a[@title='后一页']")
对于查找元素,我这里使用的是x_path方法,driver提供有其他方法(请自行百度),如果你不熟悉xpath,可以参考菜鸟教程。
查找到我们想要的元素后,可以通过text方法拿到我们想要的内容。由于需要自动翻页,通过找到对应的元素,使用click方法即可。
# 获取评论
data = driver.find_elements_by_xpath("//p[@class='rev-txt']")
# 下一页按钮
button = driver.find_element_by_xpath("//a[@title='后一页']")
# 点击
button.click()
爬取过程中,我发现爬到第12页后就给我ban了。(猜想是因为一直点翻页...,所以我就加了如下内容,模仿得像人一样)。
# 获取网页顶部大标题
head = driver.find_element_by_xpath("//h1")
head.click()
time.sleep(random.uniform(1, 1.5))
3.全部代码
代码如下,我把爬取到的数据写入到了txt文件中。
from selenium import webdriver
import time
import random
file = open('国家博物馆.txt', "w")
url = "http://www.mafengwo.cn/poi/34665.html"
# 初始化
driver = webdriver.Safari()
# 请求网页
driver.get(url)
# 最大化浏览器窗口
driver.maximize_window()
# 查找元素
button = driver.find_element_by_xpath("//a[@title='后一页']")
count = 1
while True:
print("*" * 100)
print("第{}页".format(count))
print("*" * 100, "\n")
data = driver.find_elements_by_xpath("//p[@class='rev-txt']")
for content in data:
file.writelines(content.text.strip("\n").strip() + "\n")
print(content.text)
try:
count += 1
button = driver.find_element_by_xpath("//a[@title='后一页']")
button.click()
if count > 5 and random.uniform(0, 1) > 0.5:
time.sleep(1)
head = driver.find_element_by_xpath("//h1")
head.click()
time.sleep(random.uniform(1, 1.5))
time.sleep(random.uniform(5, 9))
except Exception as e:
print("\n\n", e)
print("结束!")
break
结果:如下。进一步的,你可以利用这些评论,制作词云来进行意见分析,改善相关服务!