我使用以下迷你基本蜘蛛来获取网站上的所有链接。
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 €</span>
马尔科
答案 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选择器,因为在这种情况下它更直观。您可以使用css
和xpath
方法直接在响应中调用选择器。它们都会返回您可能再次使用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