我尝试从https://www.premierleague.com/players中抓取数据。在网页上,有一个玩家列表。我使用xpath表达式response.xpath('//td/a/@ href').getall()来获得每个玩家的相对url列表。然后我遍历相对url列表,并将它们与主页合并,以获得一个名为“absolute_url“的变量,其中一个玩家的 www. example.com ”+“/players/63289/Brenden-Aaronson/overview”https://www.premierleague.com/players/63289/Brenden-Aaronson/overview。我在scrapy shell上测试了xpath,他们在scrapy shell上产生了想要的输出...至少对于我测试的玩家的概述页面是这样。我哪里出错了?
import scrapy
from urllib.parse import urljoin
class PlStatsSpider(scrapy.Spider):
name = 'pl_stats'
allowed_domains = ['premierleague.com']
start_urls = ['http://premierleague.com']
def parse(self, response):
url = 'http://premierleague.com'
for link in response.xpath('//td/a/@href').getall():
absolute_url = urljoin(url, link) #merging relative url
yield response.follow(absolute_url, callback=self.parse_players)
def parse_players(self, response):
yield {
'Name': response.xpath('//h1/div[@class="name t-colour"]/text()').get(),
'DOB': response.xpath('//div[@class="personalLists"]//div[@class="info"]/text()')[3].get().strip(),
'Height': response.xpath('//div[@class="personalLists"]//div[@class="info"]/text()')[5].get(),
'Club': response.xpath('//div[@class="info"]/a/text()').get().strip(),
'Weight': response.xpath('//div[@class="personalLists"]//div[@class="info"]/text()')[6].get(),
'Position': response.xpath('//section[@class="sideWidget playerIntro t2-topBorder"]//div[@class="info"]/text()')[2].get(),
'Nationality': response.xpath('//span[@class="playerCountry"]/text()').get()}
1条答案
按热度按时间6qqygrtg1#
大多数的xpath对于你试图从其中抓取数据的许多不同的页面来说都有点太模糊了。所有的播放器页面都有轻微的变化,这使得使用位置索引来提取数据几乎是不可能的。另外,并不是每个字段都对每个播放器可用,例如
position
和club
,您可以对这些字段执行的操作是遍历它们的section元素,并获取所有的“label,”'info'配对并匹配输出中可用的任何内容。例如:
这是调用
scrapy crawl pl_stats -o players.json
后生成的json文件。