【发布时间】:2011-03-08 02:34:52
【问题描述】:
我正在使用 scrapy 抓取网站。该网站每页有 15 个列表,然后有一个下一步按钮。我遇到了一个问题,在我完成解析管道中的所有列表之前,我的下一个链接请求被调用。这是我的蜘蛛的代码:
class MySpider(CrawlSpider):
name = 'mysite.com'
allowed_domains = ['mysite.com']
start_url = 'http://www.mysite.com/'
def start_requests(self):
return [Request(self.start_url, callback=self.parse_listings)]
def parse_listings(self, response):
hxs = HtmlXPathSelector(response)
listings = hxs.select('...')
for listing in listings:
il = MySiteLoader(selector=listing)
il.add_xpath('Title', '...')
il.add_xpath('Link', '...')
item = il.load_item()
listing_url = listing.select('...').extract()
if listing_url:
yield Request(urlparse.urljoin(response.url, listing_url[0]),
meta={'item': item},
callback=self.parse_listing_details)
next_page_url = hxs.select('descendant::div[@id="pagination"]/'
'div[@class="next-link"]/a/@href').extract()
if next_page_url:
yield Request(urlparse.urljoin(response.url, next_page_url[0]),
callback=self.parse_listings)
def parse_listing_details(self, response):
hxs = HtmlXPathSelector(response)
item = response.request.meta['item']
details = hxs.select('...')
il = MySiteLoader(selector=details, item=item)
il.add_xpath('Posted_on_Date', '...')
il.add_xpath('Description', '...')
return il.load_item()
这些行是问题所在。就像我之前说的,它们在蜘蛛完成对当前页面的爬取之前被执行。在网站的每个页面上,这导致我的 15 个列表中只有 3 个被发送到管道。
if next_page_url:
yield Request(urlparse.urljoin(response.url, next_page_url[0]),
callback=self.parse_listings)
这是我的第一个蜘蛛,可能是我的设计缺陷,有没有更好的方法来做到这一点?
【问题讨论】:
-
嗨。你的代码工作了吗?我应该像蜘蛛侠一样,将无法链接到另一个页面,但似乎无法找到annyt。你的工作代码可以是:使用。啧啧!
-
不,我没有。我什至联系了scrapy的创建者,但他们没有帮助。
-
我刚刚用不同的关键字进行了搜索,发现了这个:abuhijleh.net/2011/02/13/… 我希望它有所帮助。我还没有编写自己的爬虫。如果我做了什么,我会发布一些东西。
-
@Victor 字体不错。 +1 了