首页 > 解决方案 > Python网络刮刀打印“无”,我该如何解决?

问题描述

我正在尝试为学校做一个项目,在该项目中我取给定的股票代码名称并在 SeekingAlpha 上查找“观看”它的人数,但是当我尝试打印时,我一直得到“无”值。我怎样才能解决这个问题?

这是我第一次尝试网络抓取,但我对 BeautifulSoup 进行了一些研究,并认为这是最好的使用方法。我也在使用 Anaconda 环境。在我的代码中,我试图找到股票代码的完整公司名称,以及在 SeekingAlpha 上关注它的人数。出于某种原因,我能够检索股票代码的公司名称,但是当我尝试打印关注者数量时,它显示“无”。我已经尝试了所有我能想到的变化来找到追随者,但他们都导致“无”。

这是 HTML:(这里我想要值 83,530)

这是我的代码:

import requests
import urllib.request as urllib2
from urllib.request import Request, urlopen
from bs4 import BeautifulSoup
from lxml import etree

listOfTickers = ["ATVI", "GOOG", "AAPL", "AMZN", "BRK.B", "BRK.A", "NFLX", "SNAP"]

for i in range(len(listOfTickers)):
    ticker = listOfTickers[i]
    quotePage = Request("https://seekingalpha.com/symbol/" + ticker, headers = {'User-Agent': 'Mozilla/5.0'})

    page = urlopen(quotePage).read()

    soup = BeautifulSoup(page, "lxml")

    company_name = soup.find("div", {"class" :"ticker-title"})
    followers_number = soup.find('div', {"class":"followers-number"})

    company= company_name.text.strip()
    #followers = followers_number.text.strip()

    print(followers_number)
    print(company)

这是我的结果

这是我的结果:

标签: pythonweb-scraping

解决方案


由于追随者计数是通过 ajax 加载的,BeautifulSoup因此无法访问其值。使用像 selineum/Phantojs 这样的无头浏览器,您可以获得完整的 html,包括 javascript 生成的内容。另一种方法是向 javascript 渲染页面特定部分的端点发出额外请求。这是一个有效的解决方案

import requests
import urllib.request as urllib2
from urllib.request import Request, urlopen
from bs4 import BeautifulSoup
from lxml import etree

listOfTickers = ["ATVI", "GOOG", "AAPL", "AMZN", "BRK.B", "BRK.A", "NFLX", "SNAP"]

def getFollowersCount(ticker):

    # build url 
    url = 'https://seekingalpha.com/memcached2/get_subscribe_data/{}?id={}'.format(ticker.lower(), ticker.lower())

    # Using requests module not urllib.request.
    counter = requests.get(url)

    # If requests return is json than return portfolio_count otherwise 0
    try:
        return counter.json()['portfolio_count']
    except:
        return 0

for ticker in listOfTickers:

    quotePage = Request("https://seekingalpha.com/symbol/" + ticker, headers = {'User-Agent': 'Mozilla/5.0'})

    page = urlopen(quotePage).read()

    soup = BeautifulSoup(page, "lxml")

    company_name = soup.find("div", {"class" :"ticker-title"})
    #followers_number = soup.find('div', {"class":"followers-number"})
    followers_number = getFollowersCount(ticker)

    company= company_name.text.strip()
    #followers = followers_number.text.strip()

    print(followers_number)
    print(company)

推荐阅读