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):
ありがとうございます。
最終的にはスキップしたURLに戻りますか。私はそれが線形には機能しないと信じて、どのドメインにも当てはまるレートを制限します。それがあなたの問題だろうか? – Phil
私はそれを信じていません、少なくとも、それはログに書き込まれていないし、コンソール出力はそれがそうであることを示していません。ログとコンソールの両方がそのまま続行されます( 行140,141,142,143など)。スキップされた行に戻ることはありません。私は、クモが最初の12行を手に入れていないと言います。 – Bodd
スタートラインが違う番号、例えば140の場合は違いがありますか?スキップしているURLやファイル形式の問題に問題はないことを除外しようとしています。たぶんあなたのprintステートメントに 'url.strip()'を追加して、何が通過するべきかを現実に反映させてください。 – Phil