我正在尝试使用Scrapy从以下网址获取所有当前WWE超级巨星的名称:http://www.wwe.com/superstars 但是,当我运行我的刮刀时,它不会返回任何名称。我相信(通过尝试其他模块的问题)问题是Scrapy没有找到页面中的所有html元素。我尝试了请求和Beautiful Soup的问题,当我查看请求获得的html时,它忽略了我在浏览器检查器中看到的html的重要方面。包含名称的html如下所示:
<div class="superstars--info"> == $0
<span class="superstars--name">name here</span>
</div>
我的代码发布在下面。我做错了会导致这种情况无效吗?
import scrapy
class SuperstarSpider(scrapy.Spider):
name = "star_spider"
start_urls = ["http://www.wwe.com/superstars"]
def parse(self, response):
star_selector = '.superstars--info'
for star in response.css(star_selector):
NAME_SELECTOR = 'span ::text'
yield {
'name' : star.css(NAME_SELECTOR).extract_first(),
}
答案 0 :(得分:2)
听起来该网站有动态内容,可能使用javascript和/或xhr调用加载。查看splash它是一个javascript渲染引擎,其行为与phantomjs非常相似。如果您知道如何使用docker,则设置起来非常简单。在进行了初始设置后,您必须使用scrapy-splash插件将其与scrapy集成。
答案 1 :(得分:1)
由于内容是javascript生成的,因此您有两种选择:使用类似selenium
的内容来模仿浏览器并解析html内容,或者如果可以,直接查询API。
在这种情况下,这个简单的解决方案有效:
import requests
import json
URL = "http://www.wwe.com/api/superstars"
with requests.session() as s:
s.headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:50.0) Gecko/20100101 Firefox/50.0'}
resp = s.get(URL).json()
for x in resp['talent'][:10]:
print(x['name'])
输出(前10条记录):
Abdullah the Butcher
Adam Bomb
Adam Cole
Adam Rose
Aiden English
AJ Lee
AJ Styles
Akam
Akeem
Akira Tozawa