日安,
我正在尝试使用Scrapy来抓取GitHub。它在很大程度上是有效的,但一些页面在页面本身加载完成后加载“贡献者”。当Scrapy遇到这样的页面时,它会抛出以下错误:AttributeError: 'NoneType' object has no attribute 'strip'
并丢弃该URL中的所有其他内容。
有没有办法在“away”中做一个异常,这样Scrapy就可以把"None“放到结果.CSV中,而不是丢弃所有的数据?
相关代码如下:
rules = [
Rule(LinkExtractor(allow=('Repositories'), restrict_xpaths=('//a[@rel="next"]'))),
Rule(LinkExtractor(allow=('github'), restrict_xpaths=('//h3/a[@class="v-align-middle"]')), callback='parse_project'),
Rule(LinkExtractor(allow=('commits/master'), restrict_xpaths=('//*[@class="commits"]/a')), follow=True, callback='parse_commits_page'),
Rule(LinkExtractor(deny=('\+174'), restrict_xpaths=('//a[contains(text(), "Older")]')), follow=True, callback='parse_commits_page')
]
# Parse the main page of the project
def parse_project(self, response):
yield {
'author': response.xpath('//a[@rel="author"]/text()').extract(),
'name': response.xpath('//strong[@itemprop="name"]/a/text()').extract(),
'tags': [x.strip() for x in response.xpath('//a[contains(@class, "topic-tag")]/text()').extract()],
'about': response.xpath('//*[@itemprop="about"]/text()').extract_first().strip(),
'lang_name': response.xpath('//span[@class = "lang"]/text()').extract(),
'lang_perc' : response.xpath('//span[@class = "percent"]/text()').extract(),
'stars': response.xpath('//a[contains(@aria-label, "starred")]/text()').extract_first().strip(),
'forks': response.xpath('//a[contains(@aria-label, "forked")]/text()').extract_first().strip(),
'commits': response.xpath('//a[contains(., "commits")]/span/text()').extract_first().strip(),
'contributors': response.xpath('//a[contains(., "contributor")]/span/text()').extract_first().strip(),
'last_commits': None
}
特别是,'contributors': response.xpath('//a[contains(., "contributor")]/span/text()').extract_first().strip(),
是给我带来麻烦的部分,也是我想要异常的地方。
另外,我也尝试过使用"scrapy-splash“让它等待页面。
def pre_parse_project(self, response):
yield scrapy_splash.SplashRequest(response.url, self.parse_project,
args={
'wait': 4,
}
)
但问题仍然存在,所以我至少希望获得我能获得的所有数据,并使用API填充贡献者的数量。
https://stackoverflow.com/questions/52059893
复制相似问题