gpt4 book ai didi

web-scraping - Scrapy - 解析给定域的所有子页面

转载 作者:行者123 更新时间:2023-12-04 20:12:40 25 4
gpt4 key购买 nike

我想使用scrapy解析kickstarter.com项目,但不知道如何制作我没有在start_urls下明确指定的蜘蛛搜索项目。我已经弄清楚了scrapy代码的第一部分(我可以从一个网站提取必要的信息),但我无法让它为域kickstarter.com/projects下的所有项目执行此操作。

根据我的阅读,我相信解析是可能的(1)使用起始页面(kickstarter.com/projects)上的链接,(2)使用来自一个项目页面的链接跳转到另一个项目,以及(3)使用用于定位要解析的网页的站点地图(我认为 kickstarter.com 没有)。

我已经花了几个小时尝试这些方法中的每一种,但我一无所获。

我使用了scrapy教程代码并以此为基础。

这是到目前为止有效的部分:

from scrapy import log
from scrapy.contrib.spiders import CrawlSpider
from scrapy.selector import HtmlXPathSelector

from tutorial.items import kickstarteritem

class kickstarter(CrawlSpider):
name = 'kickstarter'
allowed_domains = ['kickstarter.com']
start_urls = ["http://www.kickstarter.com/projects/brucegoldwell/dragon-keepers-book-iv-fantasy-mystery-magic"]

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

item = kickstarteritem()
item['url'] = response.url
item['name'] = x.select("//div[@class='NS-project_-running_board']/h2[@id='title']/a/text()").extract()
item['launched'] = x.select("//li[@class='posted']/text()").extract()
item['ended'] = x.select("//li[@class='ends']/text()").extract()
item['backers'] = x.select("//span[@class='count']/data[@data-format='number']/@data-value").extract()
item['pledge'] = x.select("//div[@class='num']/@data-pledged").extract()
item['goal'] = x.select("//div[@class='num']/@data-goal").extract()
return item

最佳答案

由于您正在继承 CrawlSpider , 不要覆盖 parse . CrawlSpider的链接抓取逻辑包含在 parse 中,你真正需要的。

至于爬行本身,这就是 rules类属性用于。我还没有测试过,但它应该可以工作:

from scrapy.contrib.spiders import CrawlSpider
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.contrib.loader import XPathItemLoader
from scrapy.selector import HtmlXPathSelector

from tutorial.items import kickstarteritem

class kickstarter(CrawlSpider):
name = 'kickstarter'
allowed_domains = ['kickstarter.com']
start_urls = ['http://www.kickstarter.com/discover/recently-launched']

rules = (
Rule(
SgmlLinkExtractor(allow=r'\?page=\d+'),
follow=True
),
Rule(
SgmlLinkExtractor(allow=r'/projects/'),
callback='parse_item'
)
)

def parse_item(self, response):
xpath = HtmlXPathSelector(response)
loader = XPathItemLoader(item=kickstarteritem(), response=response)

loader.add_value('url', response.url)
loader.add_xpath('name', '//div[@class="NS-project_-running_board"]/h2[@id="title"]/a/text()')
loader.add_xpath('launched', '//li[@class="posted"]/text()')
loader.add_xpath('ended', '//li[@class="ends"]/text()')
loader.add_xpath('backers', '//span[@class="count"]/data[@data-format="number"]/@data-value')
loader.add_xpath('pledge', '//div[@class="num"]/@data-pledged')
loader.add_xpath('goal', '//div[@class="num"]/@data-goal')

yield loader.load_item()

蜘蛛爬取最近启动的项目的页面。

另外,请使用 yield而不是 return .最好将蜘蛛的输出保持为生成器,它可以让您产生多个项目/请求,而无需制作列表来保存它们。

关于web-scraping - Scrapy - 解析给定域的所有子页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15400215/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com