文章目录
第二十一章 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
下面为了方便观察,我们获取一下收藏的专题: