当前位置: 首页 > 面试题库 >

Python Scrapy动态网站

黄景胜
2023-03-14
问题内容

我试图在Scrapy及其xpath选择器的帮助下抓取一个非常简单的网页,但由于某些原因,我拥有的选择器在Scrapy中不起作用,但在其他xpath实用程序中却起作用

我正在尝试解析此html代码段:

<select id="chapterMenu" name="chapterMenu">

<option value="/111-3640-1/20th-century-boys/chapter-1.html" selected="selected">Chapter 1: Friend</option>

<option value="/111-3641-1/20th-century-boys/chapter-2.html">Chapter 2: Karaoke</option>

<option value="/111-3642-1/20th-century-boys/chapter-3.html">Chapter 3: The Boy Who Bought a Guitar</option>

<option value="/111-3643-1/20th-century-boys/chapter-4.html">Chapter 4: Snot Towel</option>

<option value="/111-3644-1/20th-century-boys/chapter-5.html">Chapter 5: Night of the Science Room</option>

</select>

Scrapy parse_item代码:

def parse_item(self, response):
    itemLoader = XPathItemLoader(item=MangaItem(), response=response)
    itemLoader.add_xpath('chapter', '//select[@id="chapterMenu"]/option[@selected="selected"]/text()')
    return itemLoader.load_item()

Scrapy不会从中提取任何文本,但是如果我得到相同的xpath和html代码片段并在此处运行它,则效果很好。

如果我使用这个xpath:

//select[@id="chapterMenu"]

我得到正确的元素,但是当我尝试访问其中的选项时却什么也没有


问题答案:

Scrapy仅对URL执行GET请求,它不是Web浏览器,因此无法运行JavaScript。因此,仅Scrapy不足以抓取动态网页。

另外,您将需要Selenium之类的东西,它基本上为您提供了多个Web浏览器及其功能的接口,其中之一是能够运行JavaScript并获取客户端生成的HTML。

以下是如何执行此操作的摘要:

from Project.items import SomeItem
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.selector import Selector
from selenium import webdriver
import time

class RandomSpider(CrawlSpider):

    name = 'RandomSpider'
    allowed_domains = ['random.com']
    start_urls = [
        'http://www.random.com'
    ]

    rules = (
        Rule(SgmlLinkExtractor(allow=('some_regex_here')), callback='parse_item', follow=True),
    )

    def __init__(self):
        CrawlSpider.__init__(self)
        # use any browser you wish
        self.browser = webdriver.Firefox()

    def __del__(self):
        self.browser.close()

    def parse_item(self, response):
        item = SomeItem()
        self.browser.get(response.url)
        # let JavaScript Load
        time.sleep(3)

        # scrape dynamically generated HTML
        hxs = Selector(text=self.browser.page_source) 
        item['some_field'] = hxs.select('some_xpath')
        return item


 类似资料:
  • 主要内容:静态网页,动态网页本节我们了解一下静态网页和动态网页的相关概念。如果您熟悉前端语言的话,那么您可以快速地了解本节知识。 当我们在编写一个爬虫程序前,首先要明确待爬取的页面是静态的,还是动态的,只有确定了页面类型,才方便后续对网页进行分析和程序编写。对于不同的网页类型,编写爬虫程序时所使用的方法也不尽相同。 静态网页 静态网页是标准的 HTML 文件,通过 GET 请求方法可以直接获取,文件的扩展名是 、 等,网面中

  • 我可以看到请求消息被加入和出列,响应消息被加入和出列。但我有个例外, 我应该如何检索响应?

  • 问题内容: 简短的问题:我需要使用Wicket将从数据库中提取的动态图像转换为URL,而无需将组件添加到显示页面(例如,使用NonCachingImage)。 完美的解决方案(我已在其他Framework中实现)只是创建一个页面,该页面将图像ID作为url参数并将图像呈现到响应流。不幸的是,Wicket的Page类扩展了MarkupContainer,它围绕MarkupStreams展开。Mark

  • 我只是想看看在以下情况下最好的做法是什么。 这样dyno在不运行时就不会累积使用量,还是我就让它保持原样? 在这里做什么最好? 谢谢

  • 从网页的主要构成来说,一个标准的网页一般有4个部分组成:内容、结构、表现和行为。 内容是网页中要传达的信息,包括文本、数据、图片、视频等,一般由HTML(XHTML)来完成,也就是页面中的各种页面元素对象,它们是被动态操纵的内容; 结构是使用结构化的方法对网页中用到的信息进行分类和整理,使内容更具条理性、逻辑性和易读性; 表现是使用表现技术对已经结构化的信息进行表现上的控制,如版式、文本大小、文本

  • 主要内容:动态网页静态或平面的网页是指一个网页,其中所有的信息和材料都存储在网页文件中。 静态网页向所有用户显示不太经常改变的信息和数据。 在互联网技术中,超文本标记语言(HTML)是人们开始创建静态网页的第一语言或渠道。 HTML提供了文本,段落创建和换行符的风格。 但HTML的最重要的功能和特点是链接创建选项。 静态网页对于他们的材料和内容很有用,而这些内容很少需要修改或更新。 静态网站的优势 快速开发 低价开