Python Scrapy没有从网页获取所有html元素

时间:2018-04-09 17:50:38

标签: python html python-3.x scrapy

我正在尝试使用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(),
            }

2 个答案:

答案 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