我正在使用Scrapy抓取一个网页。我写了我的蜘蛛它工作得很好,它在页面上抓取一个项目列表(让我们称之为主页面)。 在主页面中,我认为每个项目都有一个链接,指向详细项目页面(让我们这样称呼),其中找到有关每个项目的详细信息。
现在我也想抓住细节页面,但蜘蛛会有所不同,在不同的地方可以找到不同的信息。是否有可能告诉scrapy在特定的地方寻找链接,然后刮掉与我要定义的另一个蜘蛛链接的页面?
我希望我的解释足够明确。感谢
答案 0 :(得分:0)
您可以使用BeautifulSoup定义要刮去的位置。我曾尝试使用BeautifulSoup编写一个蜘蛛程序,该程序指定您将与Urllib一起查找哪个部分。我认为这对你来说是一个有用的link。我基于此写了自己的。希望它可以帮助
答案 1 :(得分:0)
首先识别模式,然后为每个模式编写刮刀,然后根据您追踪的链接使用相关的刮刀功能。
答案 2 :(得分: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