我發現的所有關於Scrapy的例子都討論瞭如何抓取單個頁面,具有相同url模式的頁面或網站的所有頁面。 我需要抓取一系列頁面A,B,C其中,在你得到了鏈接到B等.. 例如網站結構是:如何使用scrapy抓取多個頁面?
A
----> B
---------> C
D
E
我需要抓取所有的C頁面,但要獲得鏈接到C我需要爬行之前A和B 任何提示?
我發現的所有關於Scrapy的例子都討論瞭如何抓取單個頁面,具有相同url模式的頁面或網站的所有頁面。 我需要抓取一系列頁面A,B,C其中,在你得到了鏈接到B等.. 例如網站結構是:如何使用scrapy抓取多個頁面?
A
----> B
---------> C
D
E
我需要抓取所有的C頁面,但要獲得鏈接到C我需要爬行之前A和B 任何提示?
看到scrapy Request structure,抓取例如鏈,你將不得不使用回調參數如下所示:
class MySpider(BaseSpider):
...
# spider starts here
def parse(self, response):
...
# A, D, E are done in parallel, A -> B -> C are done serially
yield Request(url=<A url>,
...
callback=parseA)
yield Request(url=<D url>,
...
callback=parseD)
yield Request(url=<E url>,
...
callback=parseE)
def parseA(self, response):
...
yield Request(url=<B url>,
...
callback=parseB)
def parseB(self, response):
...
yield Request(url=<C url>,
...
callback=parseC)
def parseC(self, response):
...
def parseD(self, response):
...
def parseE(self, response):
...
它顯示請求未定義。我需要導入什麼來使這個代碼工作?謝謝。 –
嘗試'從scrapy.http導入請求' –
下面是一個例子蜘蛛,我寫我的一個項目:
from scrapy.contrib.spiders import CrawlSpider
from scrapy.selector import HtmlXPathSelector
from scrapy.http import Request
from yoMamaSpider.items import JokeItem
from yoMamaSpider.striputils import stripcats, stripjokes
import re
class Jokes4UsSpider(CrawlSpider):
name = 'jokes4us'
allowed_domains = ['jokes4us.com']
start_urls = ["http://www.jokes4us.com/yomamajokes/"]
def parse(self, response):
hxs = HtmlXPathSelector(response)
links = hxs.select('//a')
for link in links:
url = ''.join(link.select('./@href').extract())
relevant_urls = re.compile(
'http://www\.jokes4us\.com/yomamajokes/yomamas([a-zA-Z]+)')
if relevant_urls.match(url):
yield Request(url, callback=self.parse_page)
def parse_page(self, response):
hxs = HtmlXPathSelector(response)
categories = stripcats(hxs.select('//title/text()').extract())
joke_area = hxs.select('//p/text()').extract()
for joke in joke_area:
joke = stripjokes(joke)
if len(joke) > 15:
yield JokeItem(joke=joke, categories=categories)
我認爲解析方法就是你所追求的: 它查看start_urls頁面上的每一個鏈接,然後使用一些正則表達式來決定它是否是一個relevant_url(即我想刮的url),如果它是相關的 - 它使用yield Request( url,callback = self.parse_page),它調用parse_page方法。
這是你之後的事情嗎?
我不使用scrapy,但是[文檔](http://doc.scrapy.org/en/latest/intro/tutorial.html)非常廣泛,並且包含足夠的信息來幫助您完成此操作。看起來你需要編寫一個[鏈接提取器](http://doc.scrapy.org/en/latest/topics/link-extractors.html),它從A頁面獲取頁面「B」鏈接,然後解析'B'頁面可以找到'C'頁面的網址。嘗試這樣做,然後用代碼發佈具體問題,如果你有問題。 – ChrisP
很抱歉,對於初學者來說,文檔確實非常糟糕。有幾個而沒用的例子,你回頭看文檔網站並沒有幫助任何人。 – not2qubit