【问题标题】:Scrapy Spider: crawl a list of urls, starting from line nScrapy Spider:从第 n 行开始爬取一个 url 列表
【发布时间】:2017-12-06 11:39:08
【问题描述】:

我正在使用 Scrapy Spider 从文本文件中抓取 URL 列表。我对 Python 和 Scrapy 还很陌生,我只需要使用它来完成这项任务。

我的 URL 列表相当大,所以我是这样实现的:

from scrapy.spider import BaseSpider
from scrapy.http.request import Request
import time

class MySpider(BaseSpider):
    name = "example"
    allowed_domains = ["example.com"]


    def __init__(self, filename=None, delay=5, start_line = 0):
        self.currentline = 0
        self.download_delay = int(delay)
        self.filename = filename
        self.start_line = int(start_line)



    def start_requests(self):
        with open(self.filename, 'r') as f:
            for url in f.readlines():
                self.currentline +=1

                if self.currentline < self.start_line:
                    continue
                else:
                    print(self.currentline)
                    yield Request(url.strip(), self.parse)

    def parse(self, response):
        logfilename = 'log'
        with open(logfilename, 'a') as f:
            f.write('Crawled line ' + str(self.currentline) + ' of ' + self.filename + ': ' + response.url + '\n')

我现在不解析任何东西,我稍后会担心,现在只是记录它。

我称之为:

scrapy runspider myfolder\kwdSpider.py -a filename=myfolder\urls.txt -a delay=10 -a start_line=124

因为 url 列表可能非常大,我实现了从指定的 start_line 重新开始抓取的选项(并使用了yield Request())。实际上一切正常,除了这个:

E:\Python27>scrapy runspider mysite\kwdSpider.py -a filename=example\urls.txt -a delay=8 -a start_line=124
E:\Python27\example\kwdSpider.py:5: ScrapyDeprecationWarning: kwdSpider.MySpider inherits from deprecated class scrapy.spider.BaseSpider, please inherit from scrapy.spider.Spider. (warning only on first subclass, there may be others)
  class MySpider(BaseSpider):
2017-12-06 12:27:35+0100 [scrapy] INFO: Scrapy 0.25.1 started (bot: scrapybot)
2017-12-06 12:27:35+0100 [scrapy] INFO: Optional features available: ssl, http11
2017-12-06 12:27:35+0100 [scrapy] INFO: Overridden settings: {}
2017-12-06 12:27:35+0100 [scrapy] INFO: Enabled extensions: LogStats, TelnetConsole, CloseSpider, WebService, CoreStats, SpiderState
2017-12-06 12:27:35+0100 [scrapy] INFO: Enabled downloader middlewares: HttpAuthMiddleware, DownloadTimeoutMiddleware, UserAgentMiddleware, RetryMiddleware, DefaultHeadersMiddleware, MetaRefreshMiddleware, HttpCompressionMiddleware, RedirectMiddleware, CookiesMiddleware, ChunkedTransferMiddleware, DownloaderStats
2017-12-06 12:27:35+0100 [scrapy] INFO: Enabled spider middlewares: HttpErrorMiddleware, OffsiteMiddleware, RefererMiddleware, UrlLengthMiddleware, DepthMiddleware
2017-12-06 12:27:35+0100 [scrapy] INFO: Enabled item pipelines:
2017-12-06 12:27:35+0100 [example] INFO: Spider opened
2017-12-06 12:27:35+0100 [example] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)
2017-12-06 12:27:35+0100 [scrapy] DEBUG: Telnet console listening on 127.0.0.1:6024
2017-12-06 12:27:35+0100 [scrapy] DEBUG: Web service listening on 127.0.0.1:6081
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
2017-12-06 12:27:38+0100 [example] DEBUG: Crawled (200) <GET https://www.example.com/139th url> (referer: None)
140
2017-12-06 12:27:47+0100 [example] DEBUG: Crawled (200) <GET https://www.example.com/140th url> (referer: None)
141

看到前十几个 URL 被跳过的方式了吗?我显然没有正确理解蜘蛛是如何工作的,它是否在 start_requests 例程完成对 txt 文件的计数之前没有初始化(顺便说一句,这是我能想到的唯一方法)?

额外问题 - 这个通知是关于什么的?

@kwdSpider.MySpider inherits from deprecated class scrapy.spider.BaseSpider, please inherit from scrapy.spider.Spider. (warning only on first subclass, there may be others)
  class MySpider(BaseSpider):

谢谢。

【问题讨论】:

  • 它最终是否会回到它跳过的 URL。我相信它不是线性工作的,限制了它到达任何一个域的速率。这可能是你的问题吗?
  • 我不相信,不,至少它没有写入日志,控制台输出也没有表明它。日志和控制台都继续 - 第 140、141、142、143 行等,永远不会回到被跳过的那些。我会说蜘蛛没有得到前十行。
  • 如果你的起始行是不同的数字,比如 140,会有什么不同吗?只是试图排除它正在跳过的 URL 没有问题,或者文件格式有问题。也许还可以在您的打印声明中添加url.strip(),以显示应该经历的事情反映了现实
  • 哦,不,start_line 编号是什么或样本数据是什么都没有区别。无论我输入什么文件或从哪一行开始,它都会做同样的事情,我已经向它抛出了很多不同的文件,它做同样的事情......你的意思是哪个打印语句?那里唯一的一个打印当前行号,它是一个 int...
  • 是的,产量之前的打印。我还会在那里打印 url,可能还有当前时间(或以与 parse 函数中相同的方式记录)。我希望在您设置的 5 秒初始延迟期间不会发生那些跳过的项目。

标签: python scrapy-spider


【解决方案1】:

我将回答额外问题,而主要问题的调查仍在进行中。

关于警告:

@kwdSpider.MySpider inherits from deprecated class scrapy.spider.BaseSpider, please inherit from scrapy.spider.Spider. (warning only on first subclass, there may be others)
 class MySpider(BaseSpider):

按照消息到单词,将代码更改为:

from scrapy.spider import Spider
from scrapy.http.request import Request
import time

class MySpider(Spider):

至少应该可以解决这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多