python - Python网络刮刀打印“无”,我该如何解决?
问题描述
我正在尝试为学校做一个项目,在该项目中我取给定的股票代码名称并在 SeekingAlpha 上查找“观看”它的人数,但是当我尝试打印时,我一直得到“无”值。我怎样才能解决这个问题?
这是我第一次尝试网络抓取,但我对 BeautifulSoup 进行了一些研究,并认为这是最好的使用方法。我也在使用 Anaconda 环境。在我的代码中,我试图找到股票代码的完整公司名称,以及在 SeekingAlpha 上关注它的人数。出于某种原因,我能够检索股票代码的公司名称,但是当我尝试打印关注者数量时,它显示“无”。我已经尝试了所有我能想到的变化来找到追随者,但他们都导致“无”。
这是我的代码:
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)
这是我的结果
解决方案
由于追随者计数是通过 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)
推荐阅读
- sql - 没有第一个表ID的表连接?
- java - 确保将实体添加到休眠搜索索引
- c# - MSI 安装程序(Visual Studio 安装程序项目)未更新使用中的文件
- octobercms - 为使用 relationExtendManageWidget() 添加的字段定义默认值
- javascript - JEE Servlet / JS:document.cookie 在 Chrome 和 IE 之间没有返回相同的东西
- javascript - Chrome 扩展在两个选项卡上工作
- react-admin - 我的所有路由都在资源之前的主机之后包含一个标签,host.com/#/resource,知道我可能做了什么导致这种情况吗?
- appcode - AppCode 自动完成未显示正确结果
- r - 从R中的数据库中选择一个表
- mysql - 学校作业交付清单mysql