在 Scrapy 项目中使用 parsel

Using parsel in Scrapy project

我正在尝试使用 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?当我 运行 一个纯 parsel .py 文件时,以及在 scrapy shell 中,它都工作得很好。 (html 文件大于 10MB)
  2. 如何在我的 123Spider 中正确嵌套解析元素 class?

搜索了现有问题,但 none 符合我的情况。

更新: 目的是解析一个 .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)

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

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

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

如果你在 运行 一个独立的脚本文件或在 scrapy shell 中工作良好时工作正常,一个可能的原因是被蜘蛛中间件阻止了, 当运行通过scrapy crawl命令时,default middleware list将涉及运行进程。

您可以在

参考详情

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

谢谢。