python - 从具有相同链接的页面进行网页抓取

标签 python web-scraping xmlhttprequest

我正在尝试从该网站抓取一些信息:https://www.nordnet.se/marknaden/aktiekurser?sortField=name&sortOrder=asc&exchangeCountry=SE&exchangeList=se%3Alargecapstockholmsek

我想要做的是获取每个公司的部门信息,这些信息在公司特定页面的“Om bolaget”选项卡下提供。更具体地说,我想要获取的信息位于“Sektor”和“Branch”字段中。使用 python 中的 requestsBeautifulSoup 可以轻松获取公司特定页面的链接。

当向这些链接发出 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/

相关文章:

python - 如何在Python中的for循环 block 之外使用 "increment"变量?

python - Splat 解压字典

php - 带有 Job Queue 系统的 PHP/Laravel 中的逻辑代码

java - 抓取 url 不变的网站

javascript - 如何比较xmlhttp.responsetext?

jquery - 使用jquery自动刷新div

python - 是否可以使用 'in' 关键字来过滤 ListProperty(item_type=datetime.date)?

python - 使用等于相同 df 和另一个 df 的总和的值更新 pandas 数据框

ruby-on-rails - 将 Mechanize gem 与 Nokogirl gem 一起使用?

javascript - 如何使用 jQuery 异步上传文件?