赞
踩
人生苦短,我用Python。时年六月,岁属夏至......(跑偏了!)这两天在做旅游网站评论爬取,用作***的满意度调查,IPA分析巴拉巴拉的。
软件及工具:
Python3.7、Sublime Text 3、Google Chrome(81.0.4044.138)、Chromewebdriver
(为啥提到浏览器版本号,因为要对应的Chromedriver)Chromewebdriver下载地址
下载时选取对应版本,Windows选取chromedriver_win32.zip,win10 64位实测有效。
提醒一下,Chromedriver需要和chrome以及python的执行文件在同一目录下,如果这两步完成后你还是不能使用webdriver,那么你需要将它添加到环境变量中。
Python需要引入的模块及方法:
import time
import codecs
from selenium import webdriver #从selenium库中调用webdriver模块
from bs4 import BeautifulSoup #从 bs4模块中 引入BeautifulSoup,在结合的情况下选用
#from selenium.webdriver.chrome.options import Options
# 从options模块中调用Options类(静默模式下需要,即使用看不到浏览器运行界面的方式运行)
注:如果没有对应的模块,管理员身份打开任务管理器,使用pip install xxx 安装(xxx为对应模块名),下载安装模块时可能会报超时错误,重试就好,一次不行就多试几次;
selenium是一个web自动化工具,这里的应用是自动运行Google Chrome程序,输入并跳转到相应的页码后,爬取景点的评论;
完整代码:
- import time
- import codecs
- from selenium import webdriver #从selenium库中调用webdriver模块
- from bs4 import BeautifulSoup #从 bs4模块中 引入BeautifulSoup,在结合的情况下选用
-
- #from selenium.webdriver.chrome.options import Options # 从options模块中调用Options类
- # 把Chrome浏览器设置为静默模式1
- #chrome_options = Options() # 实例化Option对象
- # 把Chrome浏览器设置为静默模式2
- #chrome_options.add_argument('--headless')
- # 把Chrome浏览器设置为静默模式3
- #driver = webdrihttp://you.ctrip.com/ver.Chrome(options = chrome_options) # 设置引擎为Chrome,在后台默默运行
- # 把Chrome浏览器设置为静默模式4
-
-
- driver = webdriver.Chrome() # 可视化运行
- #设置引擎为Chrome,从本地打开一个Chrome浏览器
-
- myfile=codecs.open('龙虎山.txt','a+',"utf-16")
- #龙虎山
-
- driver.get('https://you.ctrip.com/sight/nanchang175/107384.html')
- #龙虎山
- # 访问页面
-
- time.sleep(3)
- #延迟时间,等待页面加载完成
- x=1#起始页码
- while x<=5:#结束页码
-
- HTML =BeautifulSoup(driver.page_source,'html.parser')
- comments = HTML.find(class_='commentList').find_all(class_='commentDetail') #使用class_name找到评论
- #print(len(comments))
- #上两行代码运用beautiful方法解析,如果不用,注释上两行代码并解除注释下一行代码,实现功能一样
- #comments = driver.find_element_by_class_name('commentList').find_elements_by_class_name('commentDetail') #使用class_name找到评论
- for i in range(len(comments)):
- write_str='第'+str(i-9+x*10)+'条评论:\r\n'+comments[i].text+'\r\n---------------------------\r\n'
- myfile.write(write_str)#保存评论
-
- #print ('评论'+str(k)+':'+comments[i].text + '\n-------------------------------------------------') #打印评论
- print('第'+str(x)+'页'+"加载完毕")
- try:
- x=x+1#下一页
- time.sleep(3)
- jumper = driver.find_element_by_class_name('ant-pagination-options-quick-jumper').find_element_by_tag_name('input')
- jumper.send_keys(x) #输入页码方法
- clickforjump = driver.find_element_by_class_name('ant-pagination-options-quick-jumper').find_element_by_class_name('jumpButton')
- #clickforjump.click()#直接点击确定
- clickforjump.send_keys("\n")#输入回车方法点击确定
- '''#下一页方法
- clickformore = driver.find_element_by_class_name('ant-pagination').find_element_by_class_name('ant-pagination-next')
- time.sleep(3)
- clickformore.click() #下一页方法
- '''#下一页方法
- except:
- print("不能再点击加载更多啦")
- break
-
- driver.close() # 关闭浏览器
- myfile.close() # 关闭文件
- print("程序结束")
有很多坑,一个一个列一下:
静默模式,这个模式的优势在于,不打扰你在程序运行的时候做其他的事儿,不占用你的界面,但是如果程序运行过程中报错,这个进程不好关闭,因为你可能还在打开并使用其他Google浏览器标签页,任务管理器会出现多个google.exe进程,不知道要关闭的是哪个进程。建议调试过程用可视化界面,程序调试成功后,实际程序长时间运行的时候用静默模式;
selenium这个模块是在用其他爬虫方法爬取动态网页不方便时的无奈之举,如果是静态网页或者能用更省资源的方法,可以优先考虑其他方法;
记事本写入的过程坎坷反复,因为网站是utf-8,但是获取后,评论中含有Unicode格式的字符,写入几条程序就会报错,由于程序中使用了(try-excpt),所以程序不报错。最后处理方法参照代码;
注意find_element是查找第一个元素,find_elements是查找所有元素,是一个列表,列表中的元素用(for XXX in XXXX)处理,逐个遍历每个列表的评论(把element
换成复数elements实现
提取多个元素);
如果使用BeautifulSoup方法进行解析,注意上面的注释部分;
在输入页面后点击确认时,使用XXX.click()输出的响应有时会被页面上的其他元素获取,所以改用XXX.send_keys("\n"),输入回车的方法点击确定;
程序运行的时候,有时候不知道它的进度(爬到多少页了),于是加上了for循环后的print('第'+str(x)+'页'+"加载完毕"),可以直观的知道当前进度,有没有无伤大雅,但用起来会更方便;
程序结束后要让他自动关闭浏览器和文件(driver.close() # 关闭浏览器 myfile.close() # 关闭文件),节省资源,也避免程序正在打开的文件因为权限问题不能手动打开;
注释写的还是比较清楚的,如果很多都看不懂或者不会的话建议参考我的其他基础爬虫博文(如果我愿意写的话,不然就去找别人的!逃!!!!)或者直接评论交流!
尾声:
写的很快,半小时交作文博客了!发布后自己看了一遍,又花了快一个小时把坑补上。。。
当然,关注,评论,点赞,收藏,你才可以更快更方便地找到我的文章。
留言我看到都会第一时间回复!
请获准后转载并注明出处!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。