2017-12-06 2 views
0

Scrapy Spiderを使用してテキストファイルからURLのリストをクロールしています。私はむしろPythonとScrapyの新機能です。私はこの作業を完了するためにそれを準備するだけです。Scrapy Spider:n行目からURLのリストをクロールする

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') 

私は今何を解析していないです、私はちょうどのためにそれをログに記録する、後でそのことについて心配ます今。私はそれを呼び出す

は、言う:URLリストが非常に大きくなることが

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

ので、私は指定された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): 

ありがとうございます。

+0

最終的にはスキップしたURLに戻りますか。私はそれが線形には機能しないと信じて、どのドメインにも当てはまるレートを制限します。それがあなたの問題だろうか? – Phil

+0

私はそれを信じていません、少なくとも、それはログに書き込まれていないし、コンソール出力はそれがそうであることを示していません。ログとコンソールの両方がそのまま続行されます( 行140,141,142,143など)。スキップされた行に戻ることはありません。私は、クモが最初の12行を手に入れていないと言います。 – Bodd

+0

スタートラインが違う番号、例えば140の場合は違いがありますか?スキップしているURLやファイル形式の問題に問題はないことを除外しようとしています。たぶんあなたのprintステートメントに 'url.strip()'を追加して、何が通過するべきかを現実に反映させてください。 – Phil

答えて

0

私はボーナスの質問に答えるつもりですが、主な問題は調査中です。警告について

:少なくともその問題を解決する必要があります

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

class MySpider(Spider): 

@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): 

語へのメッセージの後には、にコードを変更します。

関連する問題