【问题标题】:Using parsel in Scrapy project在 Scrapy 项目中使用 parsel
【发布时间】:2018-06-13 15:10:20
【问题描述】:

我正在尝试使用 parsel 库从 Scrapy 项目中的 html 文件中抓取元素。这是我的蜘蛛代码,名为123Spider

import scrapy 

import requests

class 123Spider(scrapy.Spider):

    name = "123Spider"
    start_url = [
    'file://URI'
]

    def parse(self, response):

        for commentSelector in response.css("div._li"):
            yield {
                'comment': commentSelector.css('#js_ajn > p').extract(),
        }

当我从命令行运行 scrapy crawl 123Spider -o output.json 时,它会导出一个空的 JSON 文件。终端显示这个过程:

2018-01-03 14:44:20 [scrapy.core.engine] DEBUG: Crawled (400) <GET  https://raw.githubusercontent.com/robots.txt> (referer: None)
2018-01-03 14:44:20 [scrapy.core.engine] DEBUG: Crawled (404) <GET https://raw.githubusercontent.com/xxx.html> (referer: None)
2018-01-03 14:44:20 [scrapy.spidermiddlewares.httperror] INFO: Ignoring response <404 https://raw.githubusercontent.com/xxx.html>: HTTP status code is not handled or not allowed

问题:

  1. 为什么在爬取 .html 文件时返回错误 404 和 400?当我运行纯解析 .py 文件以及在 scrapy shell 中时,它都运行良好。 (html文件>10MB)
  2. 如何在我的 123Spider 类中正确嵌套 parsel 元素?

搜索了现有问题,但没有一个符合我的方案。

更新: 目的是解析我的蜘蛛项目结构中已经存在的 .html 文件。但是,在抓取file://URI 时,终端显示没有抓取任何页面。我的 URI 中没有错字,用 scrapy shell 测试过。

2018-01-04 14:40:14 [scrapy.core.engine] INFO: Spider opened
2018-01-04 14:40:14 [scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)
2018-01-04 14:40:14 [scrapy.extensions.telnet] DEBUG: Telnet console listening on 127.0.0.1:6023
2018-01-04 14:40:14 [scrapy.core.engine] INFO: Closing spider (finished)
2018-01-04 14:40:14 [scrapy.statscollectors] INFO: Dumping Scrapy stats:
{'finish_reason': 'finished',
'finish_time': datetime.datetime(2018, 1, 4, 21, 40, 14, 392659),
'log_count/DEBUG': 1,
'log_count/INFO': 7,
'memusage/max': 55623680,
'memusage/startup': 55619584,
'start_time': datetime.datetime(2018, 1, 4, 21, 40, 14, 374933)}
2018-01-04 14:40:14 [scrapy.core.engine] INFO: Spider closed (finished)

【问题讨论】:

  • 你不应该在那里有file://URI...这是一个解释什么是文件URI的链接:en.wikipedia.org/wiki/File_URI_scheme你应该使用一个匹配你的本地文件
  • 是的...我在我的代码中放入了正确的文件结构,并且在使用 scrapy shell 进行测试时,它起作用了。

标签: python html scrapy screen-scraping parsel


【解决方案1】:

如果您在运行独立脚本文件或在 scrapy shell 中运行良好时运行良好,一个可能的原因是被蜘蛛中间件阻止, 当scrapy crawlcommand运行时,default middleware list会参与运行进程。

您可以在Scrapy 404 error: HTTP status code is not handled or not allowed参考详情

如果这个问题不是这种情况,您可以分享您正在抓取的真实网址以供进一步调查

谢谢。

【讨论】:

  • 希望不必更改中间件配置(以我的理解水平,我认为这会导致我在未来的项目中无法解决的问题)。由于我已经拥有完整的 .html 文件,也许我根本不需要使用scrapy crawl?更新了问题以反映我正在尝试做的事情。
【解决方案2】:

Scrapy 已经默认使用了 parsel 选择器,所以你甚至不需要导入它 - response.xpath()response.css() 使用底层 parsel 选择器的方法。
知道了这一点,您只需删除导入 Selector 并创建它的实例的 4 行。

真正的问题似乎是 404,这仅仅意味着找不到您尝试访问的文档。
我的第一个猜测是您的start_urls 中有错字。如果不是这种情况,您需要分享您尝试抓取的实际网址。

400 错误只是在尝试访问 robots.txt 文件但未能成功。 您可以禁用RobotsTxtMiddleware 来阻止这种情况的发生,但这并没有真正的好处,它不会给您带来任何问题并且可以忽略。

【讨论】:

  • 我想专门使用 parsel,因为我的蜘蛛项目中已经有那个 .html 文件,所以它会绕过 404 或其他 url 抓取错误。不过,我不确定如何指出它。
  • Scrapy解析本地文件没有问题,给它一个file://URI
  • 谢谢,您的回答解决了最初在 Scrapy 中使用 parsel 的问题。想知道您是否可以查看我对该问题的最新更新,但是,当我尝试 file://URI 时,它仍然无法正常工作。我怀疑这是我的蜘蛛代码...
  • 用当前代码更新你的问题,我来看看。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-19
  • 2017-09-20
  • 1970-01-01
  • 2023-03-05
  • 2014-03-07
  • 1970-01-01
相关资源
最近更新 更多