admin 管理员组

文章数量: 887021

1 安装selenium

借助 selenium 可以使用浏览器来进行爬取数据,可以解决上一节遗留的翻页问题,首先介绍一下如何集成到scrapy环境中。

由于我使用的是macbook,因此以下都是使用macbook安装的过程

( 网络上很容易找到windows安装selenium的例子,在此不做赘述 )

首先查看本地安装的chrome浏览器的版本,通过浏览器的设置 》 关于Chrome 可以查看到当前版本,例如目前我使用的版本是 126.0.xxx (arm64版本)

然后前往 https://registry.npmmirror/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']
    start_urls = ['https://place.qyer/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多页的景点信息了,下一节我们去解析景点的具体内容!

本文标签: 旅游景点 数据 scrapy