brawellen 2024-07-16 16:27 采纳率: 40%
浏览 4
已结题

爬虫scrapy+selenium框架具体搭建方法

专家您好,我刚步入爬虫大门,在编写scrapy+selenium框架的爬虫项目时运到一些困难,想请教一下:
在爬取详情数据之前,我需要先在起始网址内搜索框内输入信息,然后在点击加载后提取表格内每行的链接信息,最后循环打开各个链接,进行数据爬取,最后存储到数据库里。
前期的搜索操作和链接存储需要用到selenium,我不清楚是写在scrapy文件的爬虫代码里(parse函数?),还是写在哪个中间件的代码里(process_requests函数?),在网上查了一下感觉众说纷纭,不知从何下手。如果都不是或者有更好的方法,想请您提供一下编程思路,感谢!!

  • 写回答

4条回答 默认 最新

  • GISer Liu 2024-07-16 16:29
    关注

    该回答引用自GPT-3.5, 由博主 GISer Liu 编写:

    问题分析

    用户在编写基于Scrapy和Selenium的爬虫项目时遇到了困难,主要问题在于如何整合Selenium进行前期的搜索操作和链接提取,以及如何将这些操作与Scrapy框架结合。用户不确定这些操作应该写在Scrapy的爬虫代码中(如parse函数),还是写在某个中间件的代码中(如process_requests函数)。

    解决方案

    为了解决这个问题,我们可以将Selenium的操作集成到Scrapy的中间件中。具体来说,可以在Scrapy的下载中间件中使用Selenium来处理需要JavaScript支持的页面操作,如搜索框输入和点击加载。

    编程思路

    1. 创建Scrapy项目和爬虫:首先创建一个Scrapy项目和爬虫。
    2. 编写Selenium中间件:在Scrapy项目中创建一个自定义的下载中间件,用于处理Selenium的操作。
    3. 配置中间件:在Scrapy的设置文件中启用自定义的下载中间件。
    4. 编写爬虫逻辑:在爬虫的parse函数中处理链接提取和数据爬取。

    具体步骤

    1. 创建Scrapy项目和爬虫

    scrapy startproject myproject
    cd myproject
    scrapy genspider myspider example.com
    

    2. 编写Selenium中间件

    myproject/middlewares目录下创建一个文件selenium_middleware.py,内容如下:

    from scrapy import signals
    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.common.keys import Keys
    import time
    
    class SeleniumMiddleware:
        def __init__(self):
            self.driver = webdriver.Chrome()  # 根据需要选择浏览器驱动
    
        def process_request(self, request, spider):
            if 'search' in request.url:  # 假设搜索页面的URL包含'search'
                self.driver.get(request.url)
                time.sleep(2)  # 等待页面加载
    
                # 模拟搜索操作
                search_box = self.driver.find_element(By.NAME, 'search')  # 根据实际情况修改
                search_box.send_keys('your_search_keyword')
                search_box.send_keys(Keys.RETURN)
                time.sleep(2)  # 等待搜索结果加载
    
                # 提取链接
                links = self.driver.find_elements(By.CSS_SELECTOR, 'a.link-selector')  # 根据实际情况修改
                for link in links:
                    url = link.get_attribute('href')
                    yield scrapy.Request(url, callback=spider.parse_detail)
    
                return scrapy.http.HtmlResponse(url=request.url, body=self.driver.page_source, encoding='utf-8', request=request)
    
        def __del__(self):
            self.driver.quit()
    

    3. 配置中间件

    myproject/settings.py中添加以下配置:

    DOWNLOADER_MIDDLEWARES = {
        'myproject.middlewares.selenium_middleware.SeleniumMiddleware': 543,
    }
    

    4. 编写爬虫逻辑

    myproject/spiders/myspider.py中编写爬虫逻辑:

    import scrapy
    
    class MySpider(scrapy.Spider):
        name = 'myspider'
        start_urls = ['http://example.com/search']
    
        def parse(self, response):
            # 这里不需要处理搜索操作,因为已经在中间件中处理了
            pass
    
        def parse_detail(self, response):
            # 处理详情页面的数据
            item = {}
            item['title'] = response.css('h1::text').get()
            item['content'] = response.css('div.content::text').get()
            yield item
    

    总结

    通过上述步骤,我们将Selenium的操作集成到了Scrapy的下载中间件中,从而实现了在起始网址内搜索框内输入信息、点击加载并提取表格内每行的链接信息,最后循环打开各个链接进行数据爬取并存储到数据库中的功能。这样既利用了Selenium处理JavaScript的能力,又保持了Scrapy的高效爬取特性。

    如果该回答解决了您的问题,请采纳!如果没有,请私信联系或评论您的疑惑

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 7月23日
  • 已采纳回答 7月17日
  • 创建了问题 7月16日