同程的评论数据还是比较好爬取,不像大众点评需要你登录验证杂七杂八的,只需要找准你想要爬取的网页链接就能拿到想要的文本数据。
这里就不得不提一下爬取过程中遇到的问题,就是关于无头模式和有头模式,首先介绍一下什么是无头模式和有头模式:
无头模式和有头模式是指网络爬虫在执行过程中是否显示浏览器的界面。
有头模式是指网络爬虫在执行过程中会显示浏览器的界面,可以看到爬取过程中的页面加载、点击等操作,可以进行人工干预和调试。有头模式一般用于开发和调试阶段,便于观察爬虫的执行情况。
无头模式是指网络爬虫在执行过程中不显示浏览器的界面,所有的操作都在后台进行,不会干扰用户的正常使用。无头模式一般用于实际的爬取任务,可以提高爬取效率,减少资源消耗。
总的来说,无头模式和有头模式的区别在于是否显示浏览器界面,有头模式适用于开发和调试阶段,无头模式适用于实际的爬取任务。
1、无头模式下缺少浏览器信息,或默认填充的浏览器信息带有爬虫痕迹,会被识别为机器人而导致爬虫执行失败。
2、页面动态加载时,有时会根据页面size来布局控件,如果size太小会出现控件加载失败情况。
所以经常爬到二十多页的时候就突然报错“找不到元素无法点击”这种的错误。又或者是爬到三十多页又告诉我找不到元素,某某列表为空,就很烦。
def to_the_buttom():
js = 'document.getElementsByClassName("search-body left_is_mini")[0].scrollTop=10000'
driver.execute_script(js)
def to_the_top():
js = "var q=document.documentElement.scrollTop=0" # 滚动到最上面
driver.execute_script(js)
def to_deal_question():
driver.implicitly_wait(10)
time.sleep(3)
to_the_buttom()
time.sleep(3)
def to_view():
driver.implicitly_wait(10)
to_the_buttom()
time.sleep(3)
button = driver.find_element(By.XPATH, '//*[@id="commentModule"]/div[6]/ul/li[7]/a')
driver.execute_script("arguments[0].scrollIntoView();", button)
opt = Options()
opt.add_argument("--headless")
opt.add_argument("window-size=1920x1080")
opt.add_argument('--start-maximized')
driver = webdriver.Edge(options=opt)
url = 'https://you.ctrip.com/sight/daocheng342/11875.html'
driver.get(url)
# driver.maximize_window()
然后就可以愉快把评论全拿到手了,这里是同程旅行位于甘孜州的海螺沟景点的评论。
最后我还用jieba库做了一下词条分析,想看看这个景点大家的关注点都是些什么。这里还可以做一下词云,更好看一点。
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
import time
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.edge.options import Options
def to_the_buttom():
js = 'document.getElementsByClassName("search-body left_is_mini")[0].scrollTop=10000'
driver.execute_script(js)
def to_the_top():
js = "var q=document.documentElement.scrollTop=0" # 滚动到最上面
driver.execute_script(js)
def to_deal_question():
driver.implicitly_wait(10)
time.sleep(3)
to_the_buttom()
time.sleep(3)
def to_view():
driver.implicitly_wait(10)
to_the_buttom()
time.sleep(3)
button = driver.find_element(By.XPATH, '//*[@id="commentModule"]/div[6]/ul/li[7]/a')
driver.execute_script("arguments[0].scrollIntoView();", button)
opt = Options()
opt.add_argument("--headless")
opt.add_argument("window-size=1920x1080")
opt.add_argument('--start-maximized')
driver = webdriver.Edge(options=opt)
url = 'https://www.ly.com/scenery/BookSceneryTicket_179984.html'
driver.get(url)
# driver.maximize_window()
# add_argument() 方法添加参数
print(1)
with open("hai_luo_gou_3.txt", "a", encoding='utf-8') as f:
for x in range(3,9):
driver.implicitly_wait(10)
# to_the_buttom()
time.sleep(3)
# to_the_buttom()
for i in range(10):
text = driver.find_elements(By.CLASS_NAME, "dpdetail")[i].text
f.write(text)
f.write("\n")
print(x)
button = driver.find_element(By.XPATH, '//*[@id="pageNum_title"]/div[2]/div/a[{}]'.format(x))
button.click()
with open("hai_luo_gou_3.txt", "a", encoding='utf-8') as f:
for x in range(9,65):
driver.implicitly_wait(10)
# to_the_buttom()
time.sleep(3)
# to_the_buttom()
for i in range(10):
text = driver.find_elements(By.CLASS_NAME, "dpdetail")[i].text
f.write(text)
f.write("\n")
print(x)
button = driver.find_element(By.XPATH, '//*[@id="pageNum_title"]/div[2]/div/a[7]')
button.click()
time.sleep(1000)
driver.close()
import jieba
stopwords = [line.strip() for line in open('hit_stopwords.txt',encoding='utf-8').readlines()]
stopwords.append("\n")
# print(stopwords)
f1=open('hai_luo_gou_3.txt','r',encoding='utf-8')
code=[]
for i in f1.read().strip().split(' '):
words = jieba.lcut(i)
code+=words
d={}
for word in code:
if word not in stopwords:
d[word]=d.get(word,0)+1
ls=list(d.items())
ls.sort(key=lambda s:s[-1],reverse=True)
print(ls)
f1.close()
with open("hai_luo_gou_3_results.txt", "a", encoding='utf-8') as f:
for i in range(20):
f.write(str(ls[i]))
f.write("\n")
词云板块:
from wordcloud import WordCloud
import matplotlib.pyplot as plt
import jieba
# 打开文本
text = open("hai_luo_gou_3_results.txt", encoding="utf-8").read()
# 中文分词
# text = ' '.join(jieba.cut(text)) # 利用jieba进行分词形成列表,将列表里面的词用空格分开并拼成长字符串。
# print(text[:10000]) # 打印前100个字符
# 生成对象
wc = WordCloud(font_path="msyh.ttc", width=800, height=600, mode="RGBA", background_color=None).generate(text)
# 显示词云
plt.imshow(wc, interpolation="bilinear")
plt.axis("off")
plt.show()
# 保存到文件
# wc.to_file("bulletchinese2.png")
里面的stopwords是为了去除标点符号、特殊字符和语气助词,在主页的其他文章里有提供。
如果这篇文章能对您有所帮助的话,还望点个赞赞呀~