我正在尝试使用scrapy解析多个页面的信息。但是它似乎在完成后没有产生一个项目。可能是什么问题?
class TransfersSpider(scrapy.Spider):
name = "transfers"
start_urls = 'https://www.transfermarkt.com/kevin-de-bruyne/profil/spieler/88755'
def parse(self, response):
item = PlayerTransfersItem()
info_table = response.css('div[class="info-table info-table--right-space "]') or response.css('div[class="large-6 large-pull-6 small-12 columns spielerdatenundfakten"]')
item["name"] = response.xpath('//h1/text()').get().strip() + " " + response.xpath('//h1//following-sibling::strong/text()').get(default = "")
stats_url = response.url.replace('profil', 'leistungsdaten') #this url will be used to find the all seasons this player played in
yield scrapy.Request(stats_url, callback= self.parse_played_seasons, cb_kwargs={"item": item})
def parse_played_seasons(self, response, item): #Obtain every season the player has played in
item["seasons_stats"] = list()
seasons = response.css('div[class="inline-select"] > select[name="saison"] >option::attr(value)').getall() # Total seasons player played in
for season in seasons: # parse stats from each season
url = f"{response.url}/plus/0?saison={season}"
yield scrapy.Request(url, callback=self.parse_season, cb_kwargs= {"item": item, "season": season})
yield item #This returns a None value
def parse_season(self, response, item, season):
tables = response.css('div[class="box"] > div[class="responsive-table"]')
total_table = tables[0].css('tr> td::text').get()
if "Total" in total_table: #If there is a table with a row shwoing total results
appearances_total_table = tables[0].css('tr> td[class="zentriert"]::text').get()
goals_total_table = tables[0].css('tr> td[class="zentriert"]::text')[1].get()
assists_total_table = tables[0].css('tr> td[class="zentriert"]::text')[2].get()
season_stats = { season:{"total_goals": goals_total_table,"total_assists" : assists_total_table, "minutes_played": minutes_total_table,
"appearances": appearances_total_table}}
item["seasons_stats"].append(season_stats)
我想得到球员在每个赛季的统计数据,那么为什么它会返回一个none值呢?但是当我把yield放在parse_season
函数中时,它会返回每个赛季的重复项。
2条答案
按热度按时间jhkqcmku1#
首先尝试从常规字典的第一页收集数据,并将该字典作为参数传递给cb_kwargs。然后在最后创建Item并将数据传递给它。我还发现您的一些
css
和xpath
表达式过于复杂,难以破译,因此我在下面的示例中简化了其中的一些表达式。您也应该只在到达最后一页并收集了所有数据后才交出项目。
例如:
pipelines.py
输出
您可以添加一个类似上面的项目管道,并存储每个生成的项目的结果,然后将它们全部转储到一个json文件中。请确保在
settings.py
文件中激活管道。dffbzjpn2#
首先将这个函数添加到你的管道中。它将添加所有同名的
season_stats
玩家。然后修改您的管道,将它们附加到一个列表中,在该列表中将执行此函数,然后转储到一个json。
输出json文件: