Python Scrapy-解析页面以提取项目-然后跟踪并存储项目url内容
我有一个关于如何用scrapy做这件事的问题。我有一个爬行器,可以爬行以列出项目页面。 每次找到包含项的列表页面时,都会调用parse_item()回调来提取项数据并生成项。到目前为止一切都很好 但每个项目都有一个url,其中包含关于该项目的更多详细信息。我希望跟踪该url,并将获取的该项目url的内容存储在另一个项目字段(url\U内容)中 我不知道如何组织代码来实现这一点,因为两个链接(listings链接和一个特定的item链接)的遵循方式不同,回调在不同的时间调用,但我必须在相同的item处理中关联它们 到目前为止,我的代码如下所示:Python Scrapy-解析页面以提取项目-然后跟踪并存储项目url内容,python,scrapy,Python,Scrapy,我有一个关于如何用scrapy做这件事的问题。我有一个爬行器,可以爬行以列出项目页面。 每次找到包含项的列表页面时,都会调用parse_item()回调来提取项数据并生成项。到目前为止一切都很好 但每个项目都有一个url,其中包含关于该项目的更多详细信息。我希望跟踪该url,并将获取的该项目url的内容存储在另一个项目字段(url\U内容)中 我不知道如何组织代码来实现这一点,因为两个链接(listings链接和一个特定的item链接)的遵循方式不同,回调在不同的时间调用,但我必须在相同的ite
class MySpider(CrawlSpider):
name = "example.com"
allowed_domains = ["example.com"]
start_urls = [
"http://www.example.com/?q=example",
]
rules = (
Rule(SgmlLinkExtractor(allow=('example\.com', 'start='), deny=('sort='), restrict_xpaths = '//div[@class="pagination"]'), callback='parse_item'),
Rule(SgmlLinkExtractor(allow=('item\/detail', )), follow = False),
)
def parse_item(self, response):
main_selector = HtmlXPathSelector(response)
xpath = '//h2[@class="title"]'
sub_selectors = main_selector.select(xpath)
for sel in sub_selectors:
item = ExampleItem()
l = ExampleLoader(item = item, selector = sel)
l.add_xpath('title', 'a[@title]/@title')
......
yield l.load_item()
itemloaded = l.load_item()
# fill url contents
url = sel.select(item_url_xpath).extract()[0]
request = Request(url, callback = lambda r: self.parse_url_contents(r))
request.meta['item'] = itemloaded
yield request
def parse_url_contents(self, response):
item = response.request.meta['item']
item['url_contents'] = response.body
yield item
我遇到了完全相同的问题,由于两天来没有人回答您的问题,我认为唯一的解决方案是从
parse_item
函数中手动跟踪该URL
我是Scrapy的新手,所以我不会尝试这样做(虽然我确信这是可能的),但我的解决方案是使用
urllib
和BeatifulSoup手动加载第二页,自己提取该信息,并将其保存为项目的一部分。是的,比Scrapy进行正常解析要麻烦得多,但它应该以最少的麻烦完成这项工作。经过一些测试和思考,我发现这个解决方案适合我。
我们的想法是只使用第一条规则,它为您提供项目列表,而且非常重要的是,将follow=True添加到该规则中
在parse_item()中,您必须生成一个请求而不是一个项,但在加载该项之后。请求是指向项目详细信息url。您必须将加载的项发送到该请求回调。你做你的工作与反应,并在那里你产生的项目
因此,parse_item()的完成将如下所示:
class MySpider(CrawlSpider):
name = "example.com"
allowed_domains = ["example.com"]
start_urls = [
"http://www.example.com/?q=example",
]
rules = (
Rule(SgmlLinkExtractor(allow=('example\.com', 'start='), deny=('sort='), restrict_xpaths = '//div[@class="pagination"]'), callback='parse_item'),
Rule(SgmlLinkExtractor(allow=('item\/detail', )), follow = False),
)
def parse_item(self, response):
main_selector = HtmlXPathSelector(response)
xpath = '//h2[@class="title"]'
sub_selectors = main_selector.select(xpath)
for sel in sub_selectors:
item = ExampleItem()
l = ExampleLoader(item = item, selector = sel)
l.add_xpath('title', 'a[@title]/@title')
......
yield l.load_item()
itemloaded = l.load_item()
# fill url contents
url = sel.select(item_url_xpath).extract()[0]
request = Request(url, callback = lambda r: self.parse_url_contents(r))
request.meta['item'] = itemloaded
yield request
def parse_url_contents(self, response):
item = response.request.meta['item']
item['url_contents'] = response.body
yield item
然后parse_url_contents()将如下所示:
class MySpider(CrawlSpider):
name = "example.com"
allowed_domains = ["example.com"]
start_urls = [
"http://www.example.com/?q=example",
]
rules = (
Rule(SgmlLinkExtractor(allow=('example\.com', 'start='), deny=('sort='), restrict_xpaths = '//div[@class="pagination"]'), callback='parse_item'),
Rule(SgmlLinkExtractor(allow=('item\/detail', )), follow = False),
)
def parse_item(self, response):
main_selector = HtmlXPathSelector(response)
xpath = '//h2[@class="title"]'
sub_selectors = main_selector.select(xpath)
for sel in sub_selectors:
item = ExampleItem()
l = ExampleLoader(item = item, selector = sel)
l.add_xpath('title', 'a[@title]/@title')
......
yield l.load_item()
itemloaded = l.load_item()
# fill url contents
url = sel.select(item_url_xpath).extract()[0]
request = Request(url, callback = lambda r: self.parse_url_contents(r))
request.meta['item'] = itemloaded
yield request
def parse_url_contents(self, response):
item = response.request.meta['item']
item['url_contents'] = response.body
yield item
如果有人有其他(更好的)方法,请告诉我们
斯特凡我就是这样做的。我认为唯一的另一种选择是在存储/输出阶段重新组合数据。是的,我们还确认了scrapy group,因此我选择了我的答案