scrapy 使用“ meta”传递参数时遇到错误

bis0qfac  于 2022-11-09  发布在  其他
关注(0)|答案(1)|浏览(148)

我正在努力学习scrapy framework中“ meta”的用法。我正在尝试抓取的网站是“http://quotes.toscrape.com/“,我的要求是抓取第一页的“引用”、“作者”和作者的出生日期,其中前两个在第一级页面上,作者的出生日期在第二级页面上,我需要使用“meta”来传达引用和作者。
下面是我的代码,我的输出命令,它运行为“nothing”,我不知道是什么原因导致的,所以我在这里寻求帮助。
第一个

mhd8tkvw

mhd8tkvw1#

删除callback=self.parse_date()中的括号

import re
import scrapy
from ..items import ShuoItem
from scrapy import Request

class ShuoSpider(scrapy.Spider):
    name = 'shuo'
    allowed_domains = ['quotes.toscrape.com']
    start_urls = ['http://quotes.toscrape.com/page/1/']

    def parse(self, response):
        blocks = response.xpath(
            "//div[@class='container']/div[@class='row']/div[@class='col-md-8']/div[@class='quote']").extract()
        pattern1 = re.compile(r'<span class="text" itemprop="text">(.*?)</span>')
        pattern2 = re.compile(r'<small class="author" itemprop="author">(.*?)</small>')
        pattern3 = re.compile(r'<a href="(.*?)">')
        for block in blocks:
            quote = pattern1.findall(block)[0]
            author = pattern2.findall(block)[0]
            mo = pattern3.findall(block)[0]
            mo = response.urljoin(mo)
            yield Request(url=mo, meta={'k1': quote, 'k2': author}, callback=self.parse_date)

    def parse_date(self, response):
        item = ShuoItem()        
        item['quote'] = response.meta['k1']
        item['author'] = response.meta['k2']
        item['more'] = response.xpath("/html/body/div[@class='container']/div[@class='author-details']/p[1]/span[@class='author-born-date']/text()").extract_first()

        yield item

您可以改进的地方:

1.学习xapth的基础知识,也许你可以找到一个Xpath cheatsheet,去掉正则表达式,因为在这段代码中它真的是不必要的。它也会帮助你在未来更复杂的网页中,你的选择器会更短,更容易阅读。
1.您可以在for循环中声明该项,并将其传递给回调函数,而不是发送多个值。
1.你可以用cb_kwargs来代替meta。我觉得用...
1.不是一个错误,但阅读有关response.follow,当然你也可以使用urljoin

import scrapy
from ..items import ShuoItem

class ShuoSpider(scrapy.Spider):
    name = 'shuo'
    allowed_domains = ['quotes.toscrape.com']
    start_urls = ['http://quotes.toscrape.com/page/1/']

    def parse(self, response):
        blocks = response.xpath('//div[@class="quote"]')

        for block in blocks:
            item = ShuoItem()
            item['quote'] = block.xpath('.//span[@class="text"]/text()').get()
            item['author'] = block.xpath('.//small[@class="author"]/text()').get()
            mo = block.xpath('.//a/@href').get()
            yield response.follow(url=mo, cb_kwargs={'item': item}, callback=self.parse_date)

    def parse_date(self, response, item):
        item['more'] = response.xpath('//span[@class="author-born-date"]/text()').get()
        yield item

相关问题