Как собирать данные и скачивать файлы с веб-ссылки - PullRequest
0 голосов
/ 09 февраля 2019

У меня есть ссылка, откуда я хочу собрать сведения об объявлении и загрузить вложение с помощью Python.

url = 'https://www.nseindia.com/corporates/corporateHome.html'

Откройте вкладку «Корпоративные объявления - Акции»

Link for Collecting data

Я хочу собирать данные, как.

  1. Объявление
  2. URL-ссылка для вложения
  3. Загрузить вложение на локальный диск

1 Ответ

0 голосов
/ 09 февраля 2019

Нет необходимости использовать Selenium, поскольку данные возвращаются requests.get().Но, к сожалению, не возвращается как application/json, а скорее text/html;charset=ISO-8859-1.

Однако данные отправляются в структуре json, поэтому необходимо манипулировать строкой, чтобы иметь возможность читать ее, используя json.Затем вы можете записать это в таблицу, чтобы получить данные.

Затем, чтобы получить pdf, просто нужно перебрать те ссылки, которые вы получаете с этим, и записать на диск:

import requests
import json
from pandas.io.json import json_normalize
import bs4


base_url = 'https://www.nseindia.com'
url = 'https://www.nseindia.com/corporates/directLink/latestAnnouncementsCorpHome.jsp'

headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'}

response = requests.get(url, headers=headers)

jsonStr = response.text.strip()

keys_needing_quotes = ['company:','date:','desc:','link:','symbol:']

for key in keys_needing_quotes:
    jsonStr = jsonStr.replace(key, '"%s":' %(key[:-1]))

data = json.loads(jsonStr)
data = data['rows']

# puts the data into dataframe
df = json_normalize(data)
links = [ base_url + ele['link'] for ele in data ]


for link in links:
    response = requests.get(link, headers=headers)
    soup = bs4.BeautifulSoup(response.text, 'html.parser')

    try:
        pdf_file = base_url + soup.find_all('a', href=True)[0]['href']
    except:
        print ('PDF not found')

    path = 'C:/path/to/file/'
    filename = path + pdf_file.split('/')[-1]

    response = requests.get(pdf_file)
    with open(filename, 'wb') as f:
        f.write(response.content)

Вывод:

Вот как выглядит фрейм данных.PDF-файлы будут записаны там, где вы захотите их разместить.Обратите внимание, что некоторые из них - это zip-файлы, содержащие pdf.Я не стал их разархивировать, хотя вы могли бы добавить это как дополнительный шаг перед записью (т.е. sudo, если файл представляет собой zip-архив, распакуйте его, чтобы получить pdf, затем запишите на диск. Если файл pdf, просто напишите вдиск.)

print (df)
                                   company     ...          symbol
0                 RELIANCE CAPITAL LIMITED     ...      RELCAPITAL
1          RELIANCE INFRASTRUCTURE LIMITED     ...        RELINFRA
2                    GRAND FOUNDRY LIMITED     ...      GRANDFONRY
3                    VRL LOGISTICS LIMITED     ...          VRLLOG
4                    GRAND FOUNDRY LIMITED     ...      GRANDFONRY
5   EUROTEX INDUSTRIES AND EXPORTS LIMITED     ...      EUROTEXIND
6                     PSP PROJECTS LIMITED     ...      PSPPROJECT
7                    VRL LOGISTICS LIMITED     ...          VRLLOG
8             THE UGAR SUGAR WORKS LIMITED     ...       UGARSUGAR
9                     ZUARI GLOBAL LIMITED     ...       ZUARIGLOB
10                   VRL LOGISTICS LIMITED     ...          VRLLOG
11                  RUPA & COMPANY LIMITED     ...            RUPA
12                 ANIK INDUSTRIES LIMITED     ...        ANIKINDS
13                 ARROW GREENTECH LIMITED     ...      ARROWGREEN
14       CENTURY PLYBOARDS (INDIA) LIMITED     ...      CENTURYPLY
15                     TARA JEWELS LIMITED     ...      TARAJEWELS
16           INDO COUNT INDUSTRIES LIMITED     ...            ICIL
17         LUMAX AUTO TECHNOLOGIES LIMITED     ...       LUMAXTECH
18                BLISS GVS PHARMA LIMITED     ...        BLISSGVS
19  EUROTEX INDUSTRIES AND EXPORTS LIMITED     ...      EUROTEXIND

[20 rows x 5 columns]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...