📌  相关文章
📜  使用 Scrapy-Selenium 抓取支持 Javascript 的网站

📅  最后修改于: 2022-05-13 01:55:45.312000             🧑  作者: Mango

使用 Scrapy-Selenium 抓取支持 Javascript 的网站

Scrapy-selenium 是用于网页抓取的中间件。 scrapy 不支持抓取使用 javascript 框架的现代网站,这就是这个中间件与 scrapy 一起使用来抓取这些现代网站的原因。Scrapy-selenium 提供了有助于处理 javascript 网站的selenium功能。这样做提供的其他优点是驱动程序,我们还可以通过它看到幕后发生的事情。由于selenium是自动化工具,它还为我们提供了如何处理输入标签并根据您在输入字段中传递的内容进行抓取。使用selenium在输入字段中传递输入变得更容易。scrapy-selenium 于 2018 年首次引入,它是一个开源软件。替代方法可以是scrapy-splash

  • 安装和设置 Scrapy –
    • 安装scrapy
    • scrapy startproject projectname  (projectname is name of project)
    • 现在,让我们运行,
      scrapy genspider spidername example.com

      (将 spidername 替换为您喜欢的蜘蛛名称,将 example.com 替换为您要抓取的网站)。注意:稍后也可以更改 url,在你的 scrapy 蜘蛛中。

      刮痧蜘蛛:

  • 在scrapy项目中集成scrapy-selenium:
    • 安装 scrapy-selenium 并将其添加到您的 settings.py 文件中
      # for firefox 
      from shutil import which
        
      SELENIUM_DRIVER_NAME = 'firefox'
      SELENIUM_DRIVER_EXECUTABLE_PATH = which('geckodriver')
      SELENIUM_DRIVER_ARGUMENTS=['-headless']  
        
      # for chrome driver 
      from shutil import which
        
      SELENIUM_DRIVER_NAME = 'chrome'
      SELENIUM_DRIVER_EXECUTABLE_PATH = which('chromedriver')
      SELENIUM_DRIVER_ARGUMENTS=['--headless']  
        
      DOWNLOADER_MIDDLEWARES = {
           'scrapy_selenium.SeleniumMiddleware': 800
           }
      
    • 本项目使用chrome驱动,根据chrome浏览器版本下载Chrome驱动。转到 chrome 浏览器中的帮助部分,然后单击关于 Google chrome 并检查您的版本。从此处提到的网站下载 chrome 驱动程序下载 chrome 驱动程序
    • 在哪里添加chromedriver:
    • 在 settings.py 文件中添加:
    • 在蜘蛛文件中进行更改:
    • 运行项目:
      command- scrapy crawl spidername (scrapy crawl integratedspider in this project)
      
    • scrapy-selenium之前的蜘蛛代码:
      import scrapy
        
      class IntegratedspiderSpider(scrapy.Spider):
          name = 'integratedspider' # name of spider
          allowed_domains = ['example.com']
          start_urls = ['http://example.com/']
        
          def parse(self, response):
              pass
      
  • scrapy-selenium 中的重要字段:
    1. name- name 是一个变量,其中写入了蜘蛛的名称并识别了每个蜘蛛
      以这个名字。运行spider的命令是,scrapy crawl spidername(这里的spidername是
      引用在蜘蛛中定义的名称)。
    2. 函数 start_requests - 通过调用 start_requests() 方法获得要执行的第一个请求,该方法为 yield SeleniumRequest 中的 url 字段中指定的 URL 生成请求,并将 parse 方法作为请求的回调函数
    3. url - 此处提供网站的 url。
    4. screenshot - 您可以使用 get_screenshot_as_file() 方法截取网页截图,并将文件名和屏幕截图作为参数保存在项目中。
    5. callback-将调用此请求的响应作为其第一个参数的函数。
    6. dont_filter-表示此请求不应被调度程序过滤。如果发送相同的 url 进行解析,它不会给出已访问的相同 url 的异常。这意味着可以多次访问相同的 url。默认值为 false。
    7. wait_time- Scrapy 不会在请求之间等待固定的时间。但是通过这个字段,我们可以在回调期间分配它。
  • scrapy-selenium spider的一般结构:
    import scrapy
    from scrapy_selenium import SeleniumRequest
      
    class IntegratedspiderSpider(scrapy.Spider):
        name = 'integratedspider'
        def start_requests(self):
            yield SeleniumRequest(
                url ="https://www.geeksforgeeks.org/",
                wait_time = 3,
                screenshot = True,
                callback = self.parse, 
                dont_filter = True    
            )
      
        def parse(self, response):
            pass
    
  • 使用 scrapy-selenium 进行刮擦的项目:
    使用 scrapy-selenium 从 geeksforgeeks 网站抓取在线课程名称

    获取我们需要废弃的元素的 X 路径 –

    从 Geeksforgeeks 中删除课程数据的代码 –

    import scrapy
    from scrapy_selenium import SeleniumRequest
       
    class IntegratedspiderSpider(scrapy.Spider):
        name = 'integratedspider'
        def start_requests(self):
            yield SeleniumRequest(
                url = "https://practice.geeksforgeeks.org/courses/online",
                wait_time = 3,
                screenshot = True,
                callback = self.parse,
                dont_filter = True
            )
       
        def parse(self, response):
            # courses make list of all items that came in this xpath
            # this xpath is of cards containing courses details
            courses = response.xpath('//*[@id ="active-courses-content"]/div/div/div')
       
            # course is each course in the courses list
            for course in courses:
                # xpath of course name is added in the course path
                # text() will scrape text from h4 tag that contains course name
                course_name = course.xpath('.//a/div[2]/div/div[2]/h4/text()').get()
       
                # course_name is a string containing \n and extra spaces
                # these \n and extra spaces are removed
       
                course_name = course_name.split('\n')[1]
                course_name = course_name.strip()
       
                   
                yield {
                    'course Name':course_name
                }
    

    输出 -

    官方链接github repo