Scrapy:列出网站中同一页面中包含的所有链接和信息

时间:2014-07-24 07:59:22

标签: html scrapy scrape

我使用以下迷你基本蜘蛛来获取网站上的所有链接。

from scrapy.item import Field, Item
from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors import LinkExtractor


class SampleItem(Item):
    link = Field()


class SampleSpider(CrawlSpider):
    name = "sample_spider"
    allowed_domains = ["example.com"]
    start_urls = ["http://www.example.com/"]

    rules = (
        Rule(LinkExtractor(), callback='parse_page', follow=True),
    )

    def parse_page(self, response):
        item = SampleItem()
        item['link'] = response.url
        return item

我想知道是否有可能添加这些蜘蛛从这些相同的链接中抓取一些html(如下所示)并在两个单独的列中列出csv中的链接和信息?

<span class="price">50,00&nbsp;€</span>

马尔科

1 个答案:

答案 0 :(得分:0)

是的,当然可能。首先,您需要使用feed export。这可以在settings.py中使用选项设置:

FEED_FORMAT = 'csv'
FEED_URL = 'file:///absolute/path/to/the/output.csv'

然后,您必须调整项目以允许更多元素。目前,您只使用该链接。您需要添加price字段。

class SampleItem(Item):
    link = Field()
    price = Field()

一个旁注:通常我们在items.py文件中定义项目,因为通常多个蜘蛛应该从多个页面中抓取相同类型的项目。然后,您可以使用from scrapername.items import SampleItem将它们导入到蜘蛛中。一个示例应用程序就是价格刮刀,它会刮擦亚马逊和一些小商店。

最后,您必须调整蜘蛛的parse_page方法。目前,您只将网址保存到商品中。您想要找到价格并保存它。在页面上查找数字或文本是抓取的关键因素。为此,我们有selectors。 Scapy支持XPath,CSS和正则表达式选择器。前两个特别有用,因为它们可以嵌套。当您找到正确的HTML元素时,通常会使用正则表达式,但在一个元素中有太多信息。

您可能遇到的问题是页面可能包含多个.price元素。你确定只有一个吗?否则,选择器将为您提供所有这些选项,您可能需要使用更多其他标记来优化选择器。

因此,我们假设只有这一个.price元素并构造我们的选择器。我们在这里使用CSS选择器,因为在这种情况下它更直观。您可以使用cssxpath方法直接在响应中调用选择器。它们都会返回您可能再次使用css()xpath()的元素。要获得文本表示,您需要在其上调用extract()。这可能在开始时很烦人,但嵌套选择器非常方便。请注意,选择器会为您提供包含标记的完整HTML元素。要仅获取文本内容,您需要明确说明。对于通过::text的CSS选择器,对于通过/text()的XPath。

def parse_page(self, response):
    item = SampleItem()
    item['link'] = response.url
    try:
        item['price'] = response.css('.price::text')[0].extract()
    except IndexError:
        # do whatever is best if price cannot be found
        item['price'] = None
    return item