python - Python Scrapy 返回 200 但关闭 Spider 却一无所获
问题描述
Scrapy 新手,尝试抓取一些简单的 Html 表格。我在同一页面中为两个不同的表找到了具有相同架构的站点,但是刮擦似乎在其中一种情况下有效,但在另一种情况下无效。这是链接:https ://fbref.com/en/comps/12/stats/La-Liga-Stats
我的代码有效(第一个表,顶部的那个):
import scrapy
class PostSpider(scrapy.Spider):
name = 'stats'
start_urls = [
'https://fbref.com/en/comps/12/stats/La-Liga-Stats',
]
def parse(self, response):
for row in response.xpath('//*[@id="stats_standard_squads"]//tbody/tr'):
yield {
'players': row.xpath('td[2]//text()').extract_first(),
'possession': row.xpath('td[3]//text()').extract_first(),
'played': row.xpath('td[4]//text()').extract_first(),
'starts': row.xpath('td[5]//text()').extract_first(),
'minutes': row.xpath('td[6]//text()').extract_first(),
'goals': row.xpath('td[7]//text()').extract_first(),
'assists': row.xpath('td[8]//text()').extract_first(),
'penalties': row.xpath('td[9]//text()').extract_first(),
}
现在由于某种原因,当我尝试抓取下表(使用相关的 xPath 选择器)时,它什么也不返回:
import scrapy
class PostSpider(scrapy.Spider):
name = 'stats'
start_urls = [
'https://fbref.com/en/comps/12/stats/La-Liga-Stats',
]
def parse(self, response):
for row in response.xpath('//*[@id="stats_standard"]//tbody/tr'):
yield {
'player': row.xpath('td[2]//text()').extract_first(),
'nation': row.xpath('td[3]//text()').extract_first(),
'pos': row.xpath('td[4]//text()').extract_first(),
'squad': row.xpath('td[5]//text()').extract_first(),
'age': row.xpath('td[6]//text()').extract_first(),
'born': row.xpath('td[7]//text()').extract_first(),
'90s': row.xpath('td[8]//text()').extract_first(),
'att': row.xpath('td[9]//text()').extract_first(),
}
这是我执行时来自终端的日志scrapy crawl stats
:
2020-07-23 17:35:33 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://fbref.com/robots.txt> (referer: None)
2020-07-23 17:35:33 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://fbref.com/en/comps/12/stats/La-Liga-Stats> (referer: None)
2020-07-23 17:35:34 [scrapy.core.engine] INFO: Closing spider (finished)
发生这种情况的原因是什么?据我所知,这些表具有相同的结构。
解决方案
问题id="stats_standard"
在源代码中不可用,请在此处查看view-source:https://fbref.com/en/comps/12/stats/La-Liga-Stats
实时 HTML 代码。它可以作为注释代码使用。
试试response.css('.placeholder ::text').getall()
。您需要使用正则表达式解析它,或者您可以使用库from scrapy import Selector
。
from scrapy import Selector
Selector(text=you_raw_html)
推荐阅读
- asp.net - How to get ID from previous route / razor page in current razor page
- javascript - Why !document.querySelectorAll not working for multiple id
- c# - How to setup Swagger.net development environment
- java - How to write the "resize" function for a self-defined ArrayList class?
- javascript - React 中的大数
- xml - 需要使用 XSLT 1.0 将 XML 节点的文本分解为子节点
- node.js - Create-react-app 返回“找不到模块 'rxjs'”
- amazon-s3 - Localstack 服务“s3”尚不可用,正在重试
- yii2 - ckEditor 5 图片上传禁止 403
- reactjs - 尝试导入错误:未从“react-bootstrap”导出“十四行诗”