1 安装selenium
借助 selenium 可以使用浏览器来进行爬取数据,可以解决上一节遗留的翻页问题,首先介绍一下如何集成到scrapy环境中。
由于我使用的是macbook,因此以下都是使用macbook安装的过程
( 网络上很容易找到windows安装selenium的例子,在此不做赘述 )
首先查看本地安装的chrome浏览器的版本,通过浏览器的设置 》 关于Chrome 可以查看到当前版本,例如目前我使用的版本是 126.0.xxx (arm64版本)
然后前往 https://registry.npmmirror.com/binary.html?path=chrome-for-testing/ 下载对应版本驱动,如果使用过低版本,可能出现无法调用问题。
下载好对应版本、对应架构的驱动后,执行操作:
# 先解压缩,然后移动到 /usr/local/bin
mv chromedriver /usr/local/bin
# 添加信任,让macos可以运行
xattr -d com.apple.quarantine /usr/local/bin/chromedriver
# 原先的程序中添加selenium
pip install selenium
2 编写爬虫
在上一节的程序的基础上,添加一个spider名字叫 qiongyou_s.py
import scrapy
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
from selenium import webdriver
import time
class QiongyouSpider(scrapy.Spider):
name = 'qys'
allowed_domains = ['qyer.com']
start_urls = ['https://place.qyer.com/tokyo/sight/']
def __init__(self, *args, **kwargs):
super(QiongyouSpider, self).__init__(*args, **kwargs)
options = webdriver.ChromeOptions()
# options.binary_location = r"/Users/teslatk/Documents/drivers/chromedriver"
options.add_argument('--headless')
self.driver = webdriver.Chrome(options=options) # 替换为 ChromeDriver 的实际路径
def start_requests(self):
for url in self.start_urls:
yield scrapy.Request(url=url, callback=self.parse)
def parse(self, response):
# 定义对网站的操作(保存HTML)
self.driver.get(response.url)
# 等待页面加载
WebDriverWait(self.driver, 10).until(
EC.presence_of_element_located((By.XPATH, '//ul[@id="poiLists"]'))
)
page_number = 1
while True:
# 保存当前页面 HTML
page_source = self.driver.page_source
filename = f'page_{page_number}.html'
with open(filename, 'w', encoding='utf-8') as f:
f.write(page_source)
self.log(f'Saved {filename}')
# 解析当前页面内容(如果需要解析,可以在这里添加解析逻辑)
# 查找并点击 "下一页" 按钮
try:
# next_button = self.driver.find_element(By.XPATH, '//a[@title="下一页"]')
# next_button.click()
next_button = self.driver.find_element(By.XPATH, '//a[@title="下一页"]')
self.driver.execute_script("arguments[0].click();", next_button)
page_number += 1
time.sleep(2) # 等待页面加载
WebDriverWait(self.driver, 10).until(
EC.presence_of_element_located((By.XPATH, '//ul[@id="poiLists"]'))
)
except Exception as e:
self.log(f"No more pages or failed to load next page: {e}")
break
self.driver.quit()
3 执行爬虫,获得效果
scrapy crawl qys
4 小结
4.1 翻页问题
值得注意的是,原先程序在执行到第4页的时候提示无法爬取更多页面,因为下一页的按钮在某一个像素点无法点击了,原因可能是页面上的浮窗或者其他内容遮挡住了这个标签,可以修改为使用javascript的方式点击下一页按钮。
# javascript 点击按钮
next_button = self.driver.find_element(By.XPATH, '//a[@title="下一页"]')
self.driver.execute_script("arguments[0].click();", next_button)
已经可以轻松爬取40多页的景点信息了,下一节我们去解析景点的具体内容!