我是新的scrapy和我一直试图刮这个网站:https://quotes.toscrape.com/
我要的数据是
- 报价;
- 作者;
- 出生日期和
- 出生地。
为了得到前2个数据(引用和作者),我必须从
https://quotes.toscrape.com/的
但要获得其他2(出生日期和出生地),我必须去“关于作者”:
第一个月
我的items.py
代码是:
import scrapy
class QuotesItem(scrapy.Item):
quote = scrapy.Field()
author = scrapy.Field()
date_birth = scrapy.Field()
local_birth = scrapy.Field()
字符串quotesipder.py
的代码是:
import scrapy
from ..items import QuotesItem
class QuotespiderSpider(scrapy.Spider):
name = "quotespider"
allowed_domains = ["quotes.toscrape.com"]
start_urls = ["https://quotes.toscrape.com/"]
def parse(self, response):
all_items= QuotesItem()
quotes = response.xpath("//div[@class='row']/div[@class='col-md-8']/div")
for quote in quotes:
all_items['quote'] = quote.xpath("./span[@class='text']/text()").get()
all_items['author'] = quote.xpath("./span[2]/small/text()").get()
# Here we get the first 2 datas.
about = quote.xpath("./span[2]/small/following-sibling::a/@href").get()
url_about = 'https://quotes.toscrape.com' + about # URL to go to 'about author'.
yield response.follow(url_about, callback=self.about_autor,
cb_kwargs={'items': all_items})
yield item
def about_autor(self, response, items): # Should get the other two datas (date_birth, local_bith)
item['date_birth '] = response.xpath("/html/body/div/div[2]/p[1]/span[1]/text()").get()
item['local_bith '] = response.xpath("/html/body/div/div[2]/p[1]/span[2]/text()").get()
yield item
型
我试过使用cb_kwargs
参数,就像在代码quotespider.py
中一样,但它不起作用。
这就是我得到的:
[
{"quote": "quote1",
"autor": "author1",
"date_birth": "",
"local_birth": ""}, # Empty for the first 10 items
...
{"quote":"quote10",
"autor": "author10",
"date_birth": "",
"local_birth": ""}, # 10th element also empty
{"quote":"quote10",
"autor": "author10",
"date_birth": "December 16, 1775",
"local_birth": "in Steventon"}, # 10th element *repeated* with wrong date_birth and local_birth
{"quote": "quote10",
"autor": "author10",
"date_birth": "June 01, 1926",
"local_birth": "United States"}, # 10th element *repeated* with wrong date_birth and local_birth
型
没有local_birth
或date_birth
被添加到前10个引号(在parse函数中添加),但最后一个引号是重复的,所有的'local-birth'和'date-birth'。
我期望得到的是这样的:
[{'quote': 'quote1',
'author': 'author1',
'date_birth': 'date_birth1',
'local_birth': 'local_birth1'},
{'quote': 'quote2',
'author': 'author2',
'date_birth': 'date_birth2',
'local_birth': 'local_birth2'},
{'quote': 'quote3',
'author': 'author3',
'date_birth': 'date_birth3',
'local_birth': 'local_birth'},
]
型
1条答案
按热度按时间zfciruhq1#
在你的代码中有一些需要修正的错误,比如在
about_autor
方法中,你传入了items,然后在方法体中使用的变量是item。还有一个yield item
语句在你的parse
方法中的yield response.follow
调用下面,它肯定会抛出错误。但除此之外,我将做一些额外的说明。
cb_kwargs
代表回调关键字参数,因此about_autor
中的第二个参数应该是关键字参数。dont_filter=True
参数添加到对response.follow
的调用中,以便在多次请求作者页面时不会过滤重复内容。这对我来说似乎很好。
范例:
字符串
输出
型