2

我正在用 Scrapy 抓取网页。我写了我的蜘蛛,它工作得很好,它会在页面上抓取一个项目列表(我们称之为主页)。在主页中,我考虑的每个项目都有一个链接,该链接指向详细项目页面(我们这样称呼它),在该页面中可以找到每个项目的详细信息。

现在我也想抓取详细信息页面,但是蜘蛛会有所不同,在不同的地方可以找到不同的信息。是否可以告诉scrapy 在特定位置查找链接,然后抓取与我要定义的另一个蜘蛛链接的那些页面?

我希望我的解释足够清楚。谢谢

4

3 回答 3

0

首先识别模式,然后为每个模式编写刮板,然后根据您正在跟踪的链接使用相关的刮板功能。

于 2013-09-16T15:06:16.067 回答
0

为了详细说明我之前的评论,这里有一个有 2 个回调的示例蜘蛛:

  • parse()将包含您已经为“主”页面拥有的逻辑,从主页面产生项目,并为每个项目的详细信息页面产生获取请求
  • parse_detail_page()将有不同的抓取逻辑,使用其他选择器,并产生另一类项目

from scrapy.selector import HtmlXPathSelector
from scrapy.spider import BaseSpider
from scrapy.http import Request
#import urlparse

# items are usually defined in yourproject.items.py
# from yourproject.items import BasicPageItem, DetailPageItem
# I'm defining them here only to illustrate
from scrapy.item import Item

class MainPageItem(Item):
    url = Field()
    name = Field()
    description = Field()

class DetailPageItem(Item):
    url = Field()
    title = Field()
    long_description = Field()
    image = Field()

class MySpider(BaseSpider):
    name = 'example.com'
    allowed_domains = ['example.com']
    start_urls = [
        'http://www.example.com/1.html',
    ]

    def parse(self, response):
        hxs = HtmlXPathSelector(response)

        for i in hxs.select('//selector/for/items').extract():
            item = MainPageItem()
            #item["url"] = item_url
            #item["name"] = item_page
            #item["description"] = item_description
            yield item

            # each item on Main page has a link
            # so yield a Request for each one
            # and tell Scrapy to parse it within another callback
            #item_url = urlparse.urljoin(response.url, item_url)
            yield Request(item_url, callback=self.parse_detail_page)

    def parse_detail_page(self, response):
        hxs = HtmlXPathSelector(response)

        item = DetailPageItem()
        item["url"] = response.url
        #item["title"] = title
        #item["long_description"] = long_description
        #item["image"] = image
        yield item
于 2013-09-16T21:56:09.273 回答
0

您可以使用 BeautifulSoup 定义要抓取的位置。我曾尝试使用 BeautifulSoup 编写一个蜘蛛程序,该程序指定您要与 Urllib 一起查找的部分。我认为这对您来说是一个有用的链接。我根据这个写了自己的。希望它可以帮助

于 2013-09-16T08:51:31.410 回答