我正在尝试从该网站抓取一些信息:https://www.nordnet.se/marknaden/aktiekurser?sortField=name&sortOrder=asc&exchangeCountry=SE&exchangeList=se%3Alargecapstockholmsek 。
我想要做的是获取每个公司的部门信息,这些信息在公司特定页面的“Om bolaget”选项卡下提供。更具体地说,我想要获取的信息位于“Sektor”和“Branch”字段中。使用 python 中的 requests
和 BeautifulSoup
可以轻松获取公司特定页面的链接。
当向这些链接发出 get 请求时,响应有时会包含以下形式的所需信息“sector: ...”和“sector_group: ...”,但并非总是如此。一个有效的例子是 Latour https://www.nordnet.se/marknaden/aktiekurser/16099736-latour-investmentab-b ,一个不起作用的例子是 EQT https://www.nordnet.se/marknaden/aktiekurser/17117956-eqt 。
请注意,我看到按“Om bolaget”时正在发出 XHR 请求(POST 请求),但我不确定如何利用它。
下面提供了我用来从公司特定页面获取部门信息的代码:
import requests
from bs4 import BeautifulSoup
import re
def get_sector(url):
sector, sector_group = None, None
resp = requests.get(url)
soup = BeautifulSoup(resp.text, 'html.parser')
tags = soup.findAll('script')
for tag in tags:
content = tag.get_text()
content = content.replace('\\', '')
if '__initialState__' not in content:
continue
try:
sector = re.findall(r'"sector":"\w+"', content)[0]
sector = json.loads('{' + sector + '}')
sector = sector['sector']
except IndexError:
print(url)
print('Sector not found')
try:
sector_group = re.findall(r'"sector_group":"\w+"', content)[0]
sector_group = json.loads('{' + sector_group + '}')
sector_group = sector_group['sector_group']
except IndexError:
print('Sector Group not found')
break
return sector, sector_group
任何意见都将不胜感激。
最佳答案
要获取 Om bolaget
批处理,您必须从 https://www.nordnet.se/api/2/login/anonymous 响应 header 获取 ntag。您可以使用一次并在以后的其他请求中使用。最好的方法是使用
requests.session() 。在
data` 17117956和16099736中应该是变量:
headers = {
'Connection': 'keep-alive',
'Content-Length': '0',
'Pragma': 'no-cache',
'Cache-Control': 'no-cache',
'Origin': 'https://www.nordnet.se',
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36',
'ntag': 'NO_NTAG_RECEIVED_YET',
'content-type': 'application/x-www-form-urlencoded',
'accept': 'application/json',
'client-id': 'NEXT',
'DNT': '1',
'Sec-Fetch-Site': 'same-origin',
'Sec-Fetch-Mode': 'cors',
'Referer': 'https://www.nordnet.se/se',
'Accept-Encoding': 'gzip, deflate, br',
'Accept-Language': 'ru,en-US;q=0.9,en;q=0.8,tr;q=0.7',
}
with requests.session() as s:
r = s.post('https://www.nordnet.se/api/2/login/anonymous', headers=headers)
headers['ntag'] = r.headers['ntag']
headers['content-type'] = 'application/json'
headers['accept'] = 'application/json'
for company_id in ['17117956', '16099736']:
data = '{"batch":"[{\\"relative_url\\":\\"company_data/keyfigures/' + company_id + '\\",\\"method\\":\\"GET\\"},{\\"relative_url\\":\\"company_data/yearlyfinancial/' + company_id + '\\",\\"method\\":\\"GET\\"},{\\"relative_url\\":\\"company_data/summary/' + company_id + '\\",\\"method\\":\\"GET\\"}]"}'
r = s.post('https://www.nordnet.se/api/2/batch', headers=headers, data=data)
print(r.text)
关于python - 从具有相同链接的页面进行网页抓取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59665796/