在 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
问题:
- 为什么抓取 .html 文件时返回错误 404 和 400?当我 运行 一个纯 parsel .py 文件时,以及在 scrapy shell 中,它都工作得很好。 (html 文件大于 10MB)
- 如何在我的 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 以供进一步调查
谢谢。
我正在尝试使用 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
问题:
- 为什么抓取 .html 文件时返回错误 404 和 400?当我 运行 一个纯 parsel .py 文件时,以及在 scrapy shell 中,它都工作得很好。 (html 文件大于 10MB)
- 如何在我的 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 以供进一步调查
谢谢。