私はスクレイピーとパイソンの初心者です。私はスクレイピー 0.17.0 で作業しています。Web サイトにクローラーを設定しました。このクローラーは、多数の要求の後にキャプチャ ページを送信します。10個の同時リクエストを設定しました。キャプチャを取得すると、キャプチャ画像をダウンロードして解決するまで、さらにリクエストを保留したいと思います。
キャプチャが解決されたら、リクエスト キューを再開したいと思います。しかし、リクエストキューを一時停止する方法がわかりません。302 ステータス (キャプチャのページ) を取得したときにスリープ時間を追加しましたが、機能していません。
以下は私のsettings.pyです
BOT_NAME = 'testBot'
SPIDER_MODULES = ['testCrawler.spiders']
NEWSPIDER_MODULE = 'testCrawler.spiders'
CONCURRENT_REQUESTS_PER_DOMAIN = 10
CONCURRENT_SPIDERS = 5
DOWNLOAD_DELAY = 5
COOKIES_ENABLED = 'false'
# SET USER AGENTS LIST
USER_AGENTS = ['Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; BTRS106490)',
'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.2; .NET4.0E; .NET4.0C)',
'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0)',
'Mozilla/5.0 (X11; Linux i686; rv:8.0) Gecko/20100101 Firefox/8.0']
PROXIES = ['http://192.168.100.225:8123']
DOWNLOADDELAYLIST = ['3', '4', '6', '5']
RETRY_TIMES = 20
RETRY_HTTP_CODES = [500, 502, 503, 504, 400, 408, 302]
これが私のクローラーです
import time
import re
from scrapy.http import Request
from scrapy.selector import HtmlXPathSelector
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.contrib.spiders import CrawlSpider, Rule
from testCrawler.items import linkItem
from testCrawler.imageItems import linkImageItem
class CategorySpider(CrawlSpider):
name = 'categoryLink'
allowed_domains = ['somedomail.com']
start_urls = ['http://somesite.com/topsearches']
def parse(self, response):
self.state['items_count'] = self.state.get('items_count', 0) + 1
self.logCaptchaPages(response.status, response.url)
hxs = HtmlXPathSelector(response)
catLinks = hxs.select('//div[@class="topsearcheschars"]/a/@href').extract()
for catLink in catLinks:
if re.match('(.*?)/[0-9]+$', catLink):
continue
else:
yield Request(catLink, callback=self.alphaDetailPage)
def alphaDetailPage(self, aResponse):
self.logCaptchaPages(aResponse.status, aResponse.url)
hxs = HtmlXPathSelector(aResponse)
pageLinks = hxs.select('//div[@class="topsearcheschars"]/a/@href').extract()
dtlLinks = hxs.select('//div[@class="topsearches"]/a/@href').extract()
for dtlLink in dtlLinks:
yield Request(dtlLink, callback=self.listPageLinks)
for pageLink in pageLinks:
if re.match('(.*?)/[0-9]+$', pageLink):
yield Request(pageLink,callback=self.pageDetail)
def pageDetail(self, bResponse):
self.logCaptchaPages(bResponse.status, bResponse.url)
hxs = HtmlXPathSelector(bResponse)
dtlLinks = hxs.select('//div[@class="topsearches"]/a/@href').extract()
for dtlLink in dtlLinks:
yield Request(dtlLink, callback=self.listPageLinks)
def listPageLinks(self, lResponse):
self.logCaptchaPages(lResponse.status, lResponse.url)
hxs = HtmlXPathSelector(lResponse)
similarSearchLinks = hxs.select('//a[@class="similar_search"]/@href').extract()
if len(similarSearchLinks) > 0:
for i in range(len(similarSearchLinks)):
yield Request(similarSearchLinks[i], callback=self.listPageLinks)
itm = linkItem()
titleList = hxs.select('//div[@id="h1-wrapper"]/h1/text()').extract()
if len(titleList) > 0:
itm['url'] = lResponse.url
itm['title'] = titleList[0]
yield itm
else:
yield
def logCaptchaPages(self, statusCode, urlToLog):
if statusCode == 302:
yield Request(urlToLog, callback=self.downloadImage)
time.sleep(10)
def downloadImage(self, iResponse):
hxs = HtmlXPathSelector(iResponse)
imageUrl = hxs.select('//body/img/@src').extract()[0]
itm = linkImageItem()
itm['url'] = iResponse.url
itm['image_urls'] = [imageUrl]
yield itm
現在、キャプチャ画像のダウンロードだけでテストしています。動作したら、キャプチャ テキストを含むキャプチャ ページにリクエストを送信する他の関数を呼び出す予定です。そのキャプチャ ページが渡されたら、次の要求に対処したいと思います。
なぜ機能しないのかについてのアイデアはありますか?
その場合、私は間違っているかもしれませんが、誰かが間違っている場所を指摘できますか?
どんな助けでも大歓迎です。ありがとう :)