利用selenium爬取《西虹市首富影评》

2024-02-08 12:40

本文主要是介绍利用selenium爬取《西虹市首富影评》,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

640?wx_fmt=png

目标网址:豆瓣网

'https://movie.douban.com/subject/27605698/comments?status=P'

使用工具:python+selenium

首先,很简单的,我们得使用selenium的webdriver去打开网址,自动实现打开网页,并且翻页:

selenium环境确保搭建完毕(如果没有搭建好,公众号python乱炖回复:selenium)

那我们就开始吧!

我们的目标网址:

url = 'https://movie.douban.com/subject/27605698/comments?status=P'

首先将selenium的webdriver导入:

from selenium import webdriver

然后使用webdriver打开浏览器:

browser = webdriver.Chrome()

打开网址:

browser.get(url)

这样就简单的打开网址了。

640?wx_fmt=png

但是只能看到20条,如果想看到后面的,就必须进行翻页,这个时候,我们就需要进行元素定位了

我们打开网页,查看翻页元素的位置:

640?wx_fmt=png

经过审查元素,我们发现,“后页”这个点击的其实是隶属于一个id=“paginator”的div标签里的a标签,所以我们可以使用简单的xpath来进行定位就可以了:

"//*[@id='paginator']/a"

先找到id=“paginator”,这样就可以定位到这个a标签了。

然后我们加入代码:

browser.find_element_by_xpath("//*[@id='paginator']/a").click()

(加个while循环,因为要翻多页)

但是我们发现操作结果,只操作了一次就停在第二页不动了,这是为什么呢?

640?wx_fmt=png

我们检查一下页面的元素:

640?wx_fmt=png

我们发现,这个div标签里竟然三个都变成的a标签,怪不得我们刚才的代码不管用了!

这个时候我们只需要取第三个标签,我们使用xpath取a的第三个元素a[3]就够啦:

browser.find_element_by_xpath("//*[@id='paginator']/a[3]").click()

这样和上面第一页的代码整合起来写就是:

i = 1

while True:

    if i==1:

        browser.find_element_by_xpath("//*[@id='paginator']/a").click()

    else:

        browser.find_element_by_xpath("//*[@id='paginator']/a[3]").click()

        browser.implicitly_wait(10)

        time.sleep(1) # 暂停1秒

        i = i + 1

这样我们就能让页面翻到最后一页啦!

我们试试看!

640?wx_fmt=png

出问题了!

我们发现读取到11页的时候就死在那了,不能再往后跳了,到底是什么问题!

之后我就自己去翻豆瓣,结果发现也是一样的,看来不是代码的问题。

一段时间后......

一柱香后.......

一觉之后.........

发现问题了,原来是没登录导致的无法查看。

那就意味着我们就要开始自动登录豆瓣了哦!

首先打开登录页进行登录,登录完切换到评论页,获取评论。

登录的loginurl:https://www.douban.com/


loginurl='https://www.douban.com/'

browser = webdriver.Chrome()

browser.get(loginurl)

打开登录页之后我们需要输入用户名和密码,审查一下输入框的元素:

640?wx_fmt=png

640?wx_fmt=png

看到了元素的id之后我们就可以获取他们并且传值了:

# 获取用户名输入框,并先清空

browser.find_element_by_name('form_email').clear() 

# 输入用户名

browser.find_element_by_name('form_email').send_keys(u'25xxxx@qq.com') 

# 获取密码框,并清空

browser.find_element_by_name('form_password').clear()  

# 输入密码

browser.find_element_by_name('form_password').send_keys(u'xxxxxx') 

然后点击提交就可以了:

browser.find_element_by_css_selector('input[class="bn-submit"]').click()

但是我们发现,就这样点击提交是无法登陆的,因为它还会跳出一个验证码,必须要把这个验证码输进去才能登陆。

这就很烦了,先不管了,手动输入吧,后面有空再去识别这个验证码。

那我们就看着网页,在验证码的框输入验证码:

captcha_code = input('Input code:')

browser.find_element_by_id('captcha_field').send_keys(captcha_code)

这样就可以了。

这样我们就能顺利爬取所有的评论了,我们现在只需要把每个页面上的评论保存下来即可:

这里我们为了保证格式工整,我们把评论做成表的形式,可以借用一下pandas的DataFrame这样一个数据格式,之后再保存为csv,所以需要导入pandas。

那么第一步,去页面检索评论的元素样式:

640?wx_fmt=png

接下来我们提取内容了:

利用apply方法,将数据加入到DataFrame里。

AllComments = pd.DataFrame()

s = browser.find_elements_by_class_name('comment-item')

articles = pd.DataFrame(s,columns = ['web'])

articles['uesr'] = articles.web.apply(lambda x:x.find_element_by_tag_name('a').get_attribute('title'))

articles['comment'] = articles.web.apply(lambda x:x.find_element_by_class_name('short').text)

articles['star'] = articles.web.apply(lambda x:x.find_element_by_xpath("//*[@id='comments']/div[1]/div[2]/h3/span[2]/span[2]").get_attribute('title'))

articles['date'] = articles.web.apply(lambda x:x.find_element_by_class_name('comment-time').get_attribute('title'))

articles['vote'] = articles.web.apply(lambda x:np.int(x.find_element_by_class_name('votes').text))

del articles['web']

AllComments = pd.concat([AllComments,articles],axis = 0)

print ('The ' + str(i) + ' page finished!')

提取的时候要把它放到while循环里,保证每页都提取到。

提取完了之后,我们把最后的数据保存到csv里面:

result.to_csv('C:\\Users\\yuqing.wu\\Downloads\\yuqing.csv',index=False,header=False)

640?wx_fmt=png

代码:

640?wx_fmt=png

完整代码见阅读原文。

640?wx_fmt=jpeg

求关注!

这篇关于利用selenium爬取《西虹市首富影评》的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/691072

相关文章

如何使用Selenium捕获控制台日志

Selenium是一个流行的开源工具,用于自动化Web浏览器。其中一个关键功能是能够与浏览器的开发者控制台交互。本文将向您展示如何在Selenium中使用Java获取控制台日志。这些日志对于调试和解决Selenium脚本的问题非常有用。 如何查看任何网页的控制台日志 首先,打开浏览器的开发者控制台。在大多数浏览器中,您可以通过右键点击页面并选择“检查”来做到这一点。我们将在我们的测试网站——h

0基础学习爬虫系列:网页内容爬取

1.背景 今天我们来实现,监控网站最新数据爬虫。 在信息爆炸的年代,能够有一个爬虫帮你,将你感兴趣的最新消息推送给你,能够帮你节约非常多时间,同时确保不会miss重要信息。 爬虫应用场景: 应用场景主要功能数据来源示例使用目的搜索引擎优化 (SEO)分析关键词密度、外部链接质量等网站元数据、链接提升网站在搜索引擎中的排名市场研究收集竞品信息、价格比较电商网站、行业报告制定更有效的市场策略舆情

python网络爬虫(五)——爬取天气预报

1.注册高德天气key   点击高德天气,然后按照开发者文档完成key注册;作为爬虫练习项目之一。从高德地图json数据接口获取天气,可以获取某省的所有城市天气,高德地图的这个接口还能获取县城的天气。其天气查询API服务地址为https://restapi.amap.com/v3/weather/weatherInfo?parameters,若要获取某城市的天气推荐 2.安装MongoDB

selenium的webdriver三种等待方式(显式等待WebDriverWait+implicitly_wait隐式等待+sleep强制等待)

隐式等待是等页面加载,不是等元素!!! 1、显式等待  一个显式等待是你定义的一段代码,用于等待某个条件发生然后再继续执行后续代码。显式等待是等元素加载!!! from selenium import webdriverfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.support.ui import

selenium webdriver实现的原理及流程

用Selenium实现自动化,主要需要三个东西: 1.自动化测试代码:自动化测试代码发送请求给浏览器的驱动(比如火狐驱动、谷歌驱动) 2.浏览器驱动:它来解析这些自动化测试的代码,解析后把它们发送给浏览器 3.浏览器:执行浏览器驱动发来的指令,并最终完成工程师想要的操作。 测试代码中包含了各种期望的对浏览器界面的操作,例如点击。测试代码通过给Webdriver发送指令,让Webdriv

Selenium 实现图片验证码识别

前言 在测试过程中,有的时候登录需要输入图片验证码。这时候使用Selenium进行自动化测试,怎么做图片验证码识别?本篇内容主要介绍使用Selenium、BufferedImage、Tesseract进行图片 验证码识别。 环境准备 jdk:1.8 tessdata:文章末尾附下载地址 安装Tesseract 我本地是ubuntu系统 sudo apt install tesserac

【爬虫渲染神器】selenium 和pyppeteer 的动态渲染ajax反爬虫

许多网页是动态加载的网页,其中不乏使用了ajax异步技术,那么我们有没有一种渲染工具,直接省略分析过程,模拟浏览器渲染的操作呢,获取到我们想要的内容。当然有,下面我们介绍两种渲染工具的实战使用。 目标网站: http://www.porters.vip/verify/sign/ 点击参看详情页的里面内容。 前一篇文章,我们介绍了,js逆向分析两种方法JS逆向–签名验证反爬虫】sign签名验证

【爬虫神器 pyppeteer】比 selenium 更高效的爬虫利器--pyppeteer

Puppeteer 是 Google 基于 Node.js 开发的工具,调用 Chrome 的 API,通过 JavaScript 代码来操纵 Chrome 完成一些操作,用于网络爬虫、Web 程序自动测试等。pyppeteer 使用了 Python 异步协程库 asyncio,可整合 Scrapy 进行分布式爬虫。要注意的是它执行python3.6+以后版本使用,下面我们一起来了解下如何使用。

CentOS7 安装Selenium+chrome+chromedriver

在无界面的CentOS7上安装Selenium+Chrome,并使用facebook的php-webdriver测试 系统环境 Operating System: CentOS Linux 7 (Core) Kernel: Linux 3.10.0-693.17.1.el7.x86_64 Architecture: x86-64 安装 chrome 使用下面的命令,在root用户下就可以安装最新

Selenium 调用 JavaScript 操作带有 readonly 属性 的日期控件

'''<input class="index_start" readonly="" placeholder="开始日期" size="12" autocomplete="off" type="text" value=""><input class="index_end" readonly="" placeholder="结束日期" size="12" autocomplete="off" ty