爬虫(23)scrapy集成selenium

本文介绍了如何将自动化测试工具Selenium集成到Scrapy中,以应对需要加载或复杂数据的爬取场景。通过实例展示了如何在Scrapy项目中使用Selenium点击简书文章详情页的'展开更多'按钮,详细讲解了集成过程,包括设置项目、定义下载中间件、处理响应等步骤,并解决了在集成过程中遇到的问题。
摘要由CSDN通过智能技术生成

第二十一章 scrapy集成selenium

1. selenium爬取简书案例

今天讲一讲自动化测试工具Selenium如何集成在srapy中。

1.1 项目目标

当数据是通过加载得到的,或者复杂的数据难于爬取,就用到selenium。简书就是这种,难爬取。
在这里插入图片描述
详情页里面有文章的内容,还有评论。
在这里插入图片描述
评论下面还有文章被收录的专题:
在这里插入图片描述
如果你的文章写的好,就会被有的人收录到自己的专题里面,这样可以增加文章的曝光度。
我们今天要讲的是如何在Scrapy中集成selenium。爬虫逻辑我们可以从普通的selenium爬虫去写。我们的目标是:
进入详情页面,在评论区收录专题里,如果有“展开更多”,我们点击一下,然后翻到下一篇。如果没有“展开更多”,我们进 入详情页面后,直接翻到下一篇,我们就做这样一个动作。我们先通过selenium做,然后再把逻辑集成到scrapy当中。

1.2 先通过selenium

我们先创建一个py文件,命名为demo23:

from selenium import webdriver

driver = webdriver.Chrome()
url = 'https://www.jianshu.com/p/a645f85e50ea'
driver.get(url)

运行测试一下:
在这里插入图片描述
浏览器被打开了,而且进入了详情页。
下面我们做一个动作,点击“展开更多”。
我们需要导入一系列方法,用来设置页面等待,因为要等展开更多按钮加载成功后才能做点击动作。下面一行代码导入By方法,后面可以定位目标。最后一行做条件等待。

from selenium.webdriver.support.ui import WebDriverWait
# 导入这个方法后面用来设置显示等待
from selenium.webdriver.common.by import By
# 导入这个方法后面用来做定位
from selenium.webdriver.support import expected_conditions as EC
# 导入这个方法用来设置条件等待

下面我们看一下按钮的位置:
在这里插入图片描述
我们可以看到按钮是在一个class="H7E3vT"的div标签里面。于是我们可能会马上用xpath定位,但是这个class="H7E3vT"是特别的,告诉大家,这个值是动态的,也就是说这次能够找到,下次就找不到了,因为值已经动态变化了。
所以,我们要用位置来定位(position)。以前在讲xpath的时候讲过(查找某个特定的节点或者包含某个指定的值的节点)。

我们可以这样定义翻页元素:
在这里插入图片描述
我们用这种方法来定位“展开更多”按钮。
在这里插入图片描述
通过观察我们发现,“展开更多”按钮在第二个section标签的div标签的最后一个div标签里面。我们通过位置来寻找这个按钮所在的标签。代码:

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
# 导入这个方法后面用来设置显示等待
from selenium.webdriver.common.by import By
# 导入这个方法后面用来定位
from selenium.webdriver.support import expected_conditions as EC
# 导入这个方法用来设置条件等待

driver = webdriver.Chrome()
url = 'https://www.jianshu.com/p/a645f85e50ea'
driver.get(url)
# 设置显示等待,“展开更多”按钮。
WebDriverWait(driver,6).until(
    EC.element_to_be_clickable((By.XPATH,'//section[position()=2]/div/div[last()]'))
)

最后一行代码,本来定位div正规的写法应该是div[postion()=1]/div[last()]。
但是由于第一个div的位置只有一个div标签,所以可以省略不写。
为了确保点到按钮,我们可以写一个循环不停的点击。

while True:
    try:
        more_btn = driver.find_element_by_xpath('//section[position()=2]/div/div[last()]')
        more_btn.click()
    except:  # 报异常的时候退出循环(当按钮被点开后,再点击就会报错)
        break
        

下面为了方便观察,我们获取一下收藏的专题:

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值