欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 房产 > 家装 > Scrapy 爬取旅游景点相关数据( 二 )

Scrapy 爬取旅游景点相关数据( 二 )

2024/10/24 19:26:36 来源:https://blog.csdn.net/roccreed/article/details/140685571  浏览:    关键词:Scrapy 爬取旅游景点相关数据( 二 )

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 scrapyfrom 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 timeclass 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 = 1while True:# 保存当前页面 HTMLpage_source = self.driver.page_sourcefilename = 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 += 1time.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}")breakself.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多页的景点信息了,下一节我们去解析景点的具体内容!

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com