我发现的Scrapy的所有示例都讨论了如何抓取单个页面,具有相同url架构的页面或网站的所有页面。 我需要抓取一系列页面A,B,C,在A中你得到了B的链接等等。 例如,网站结构是:
A
----> B
---------> C
D
E
我需要抓取所有C页面,但要获得C链接,我需要在A和B之前抓取。 任何提示?
答案 0 :(得分:12)
请参阅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):
...
答案 1 :(得分:6)
这是我为我的一个项目编写的蜘蛛示例:
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页面上的每个链接,然后使用一些正则表达式来决定它是否是related_url(即我想要抓取的url),如果它是相关的 - 它使用yield Request来抓取页面(url,callback = self.parse_page),它调用parse_page方法。
这是你追求的那种吗?