Очистка данных сайта без Selenium - PullRequest
0 голосов
/ 30 апреля 2020

В настоящее время я пытаюсь получить исторические данные CMS с этого сайта. У меня есть некоторый рабочий код, чтобы вытащить ссылки для скачивания со страницы. Моя проблема в том, что ссылки делятся на страницы. Мне нужно перебрать все доступные страницы и извлечь ссылки для скачивания. Очевидным выбором здесь является использование Selenium для перехода на следующие страницы и получения данных. Из-за политики компании я не могу запустить селен в окружающей среде. Есть ли способ, которым я могу пройти по страницам и извлечь ссылку. Веб-сайт не показывает ссылку на сообщение, когда вы пытаетесь go перейти к следующей странице. У меня нет идей, чтобы попытаться перейти на следующую страницу без ссылки на публикацию или без использования селена.

Текущий рабочий код для получения ссылок с первой страницы

import pandas as pd
from datetime import datetime
#from selenium import webdriver
from lxml import html
import requests



def http_request_get(url, session=None, payload=None, parse=True):
""" Sends a GET HTTP request to a website and returns its HTML content and full url address. """

if payload is None:
    payload = {}

if session:
    content = session.get(url, params=payload, verify=False, headers={"content-type":"text"})
else:
    content = requests.get(url, params=payload, verify=False, headers={"content-type":"text"})

content.raise_for_status()  # Raise HTTPError for bad requests (4xx or 5xx)

if parse:
    return html.fromstring(content.text), content.url
else:
    return content.text, content.url

def get_html(link):
"""
Returns a html.
"""
page_parsed, _ = http_request_get(url=link, payload={'t': ''}, parse=True)
return page_parsed


cmslink = "https://www.cms.gov/Research-Statistics-Data-and-Systems/Statistics-Trends-and- 
Reports/MCRAdvPartDEnrolData/Monthly-Contract-and-Enrollment-Summary-Report"
content, _ = http_request_get(url=cmslink,payload={'t':''},parse=True)
linkTable = content.cssselect('td[headers="view-dlf-1-title-table-column"]')[0]
headers = linkTable[0].xpath('//a/@href')
df1     =  pd.DataFrame(headers,columns= ['links'])
df1SubSet = df1[df1['links'].str.contains('contract-summary', case=False)]

1 Ответ

0 голосов
/ 30 апреля 2020

Это два URL, которые дадут вам 166 записей. Я также изменил условие для захвата hrefs. Попробуйте это.

cmslinks=[
'https://www.cms.gov/Research-Statistics-Data-and-Systems/Statistics-Trends-and-Reports/MCRAdvPartDEnrolData/Monthly-Contract-and-Enrollment-Summary-Report?items_per_page=100&items_per_page_options%5B5%5D=5%20per%20page&items_per_page_options%5B10%5D=10%20per%20page&items_per_page_options%5B25%5D=25%20per%20page&items_per_page_options%5B50%5D=50%20per%20page&items_per_page_options%5B100%5D=100%20per%20page&combine=&page=0',
'https://www.cms.gov/Research-Statistics-Data-and-Systems/Statistics-Trends-and-Reports/MCRAdvPartDEnrolData/Monthly-Contract-and-Enrollment-Summary-Report?items_per_page=100&items_per_page_options%5B5%5D=5%20per%20page&items_per_page_options%5B10%5D=10%20per%20page&items_per_page_options%5B25%5D=25%20per%20page&items_per_page_options%5B50%5D=50%20per%20page&items_per_page_options%5B100%5D=100%20per%20page&combine=&page=1']

df=pd.DataFrame()
for cmslink in cmslinks:
    print(cmslink)
    content, _ = http_request_get(url=cmslink,payload={'t':''},parse=True)
    linkTable = content.cssselect('td[headers="view-dlf-1-title-table-column"]')[0]
    headers = linkTable[0].xpath("//a[contains(text(),'Contract Summary') or contains(text(),'Monthly Enrollment by CPSC')]/@href")
    df1 = pd.DataFrame(headers,columns= ['links'])
    df=df.append(df1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...