Web Scraper не получает полные данные с веб-сайта - PullRequest
0 голосов
/ 10 июня 2019

Я пытаюсь очистить этот веб-сайт, чтобы подготовить базу данных для лагерей доноров крови с использованием python.

Во-первых, при попытке получить html-исходный код веб-сайта из запросов или urllib существует SSl: certificate_verify_error, который я обошел, установив параметр verify в False для request.get () или создав непроверенный контекст для urllib (быстрое исправление), это избавляет меня от ошибки, но когда я вижу извлеченный исходный HTML-код, то содержимое таблицы, в которой я нуждаюсь, пусто, в исходном коде веб-сайта они включены в теги tbody, но моя команда request.get () получаетМне только эти теги, а не содержание между ними.Я очень новичок в соскобе, небольшое руководство будет оценено.ty

from urllib.request import urlopen as uReq
import ssl
from bs4 import BeautifulSoup as soup

my_url = 'https://www.eraktkosh.in/BLDAHIMS/bloodbank/campSchedule.cnt'
sp_context = ssl._create_unverified_context()
uClient = uReq(my_url,context=sp_context)
page_html = uClient.read()
uClient.close()
page_soup=soup(page_html,"html.parser")
table = page_soup.find('tbody')
print (table) #this outputs "<tbody></tbody>"
trow = table.find('tr')
print (trow) #this outputs "None"


Первая команда печати дает

<tbody>
</tbody>

и вторые выходные данные

None 

Ответы [ 4 ]

1 голос
/ 10 июня 2019

Это так, потому что первый запрос возвращает почти пустой html-каркас.

Данные, которые вы видите на странице, заполняются последующими запросами ajax.Точнее, https://www.eraktkosh.in/BLDAHIMS/bloodbank/nearbyBB.cnt?hmode=GETNEARBYCAMPS&stateCode=-1&districtCode=-1&_=1560150852947

Вы можете получить эту информацию, щелкнув правой кнопкой мыши -> осмотреть -> вкладку сети и перезагрузив страницу.

Мнение: BeautifulSoup не требуется для извлеченияИнформация с этой страницы.Данные легко доступны в формате json из API, упомянутого выше.

Надеюсь, это поможет.

0 голосов
/ 10 июня 2019

Использование панд и ре

import requests
import pandas as pd
import urllib3; urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
import re

p1 = re.compile(r"(.*?)<br/>")
p2 = re.compile(r"href='(.*?)'")

def get_url(html, p): 
    if html == 'NA':
        url = html
    else:
        url = 'https://www.eraktkosh.in' + p.findall(html)[0]
    return url

def get_date(html, p): 
    if html == 'NA':
        date_string = html
    else:
        date_string = p.findall(html)[0]
    return date_string

r = requests.get('https://www.eraktkosh.in/BLDAHIMS/bloodbank/nearbyBB.cnt?hmode=GETNEARBYCAMPS&stateCode=-1&districtCode=-1&_=1560150750074', verify = False).json()
df = pd.DataFrame(r['data'])
df[1] = df[1].apply(lambda x: get_date(x, p1))
df[10] = df[10].apply(lambda x: get_url(x, p2))
print(df)
0 голосов
/ 10 июня 2019

Использование библиотеки pandas для сохранения данных в CSV-файл.

На вкладке браузера network вы увидите JSON data response из campSchedule данных таблицы.

import requests
import  pandas as pd

url = 'https://www.eraktkosh.in/BLDAHIMS/bloodbank/nearbyBB.cnt?hmode=GETNEARBYCAMPS&stateCode=-1&districtCode=-1&_=1560150855565'
jsonData = requests.get(url, verify=False).json()

campScheduleData = []

for data in jsonData['data']:
    campSchedule = {"Date":"","Time":"","Camp Name":"","Address":"","State":"","District":"",\
                    "Contact":"","Conducted By":"","Organized by":"","Register":""}
    if "<br/>" in data[1]:
        campSchedule['Date'] = data[1].split("<br/>")[0]

    if "href" in data[10]:
        campSchedule['Register'] = "https://www.eraktkosh.in" + data[10].split("href=")[1].split(" ")[0]

    campSchedule['Time'] = data[2]
    campSchedule['Camp Name'] = data[3]
    campSchedule['Address'] = data[4]
    campSchedule['State'] = data[5]
    campSchedule['District'] = data[6]
    campSchedule['Contact'] = data[7]
    campSchedule['Conducted By'] = data[8]
    campSchedule['Organized by'] = data[9]
    campScheduleData.append(campSchedule)

df = pd.DataFrame(campScheduleData)
# it will save csv file in current project directory with campScheduleData.csv file name
df.to_csv("campSchedule.csv")

Если вы не устанавливаете pandas, установите его:

pip3 install pandas
0 голосов
/ 10 июня 2019

Посмотрите на этот HTTP-вызов:

https://www.eraktkosh.in/BLDAHIMS/bloodbank/nearbyBB.cnt?hmode=GETNEARBYCAMPS&stateCode=-1&districtCode=-1&_=1560150750074

Отсюда и данные.

У вас есть 2 варианта:

  1. Сделайте HTTP-вызов и проанализируйте ответ
  2. Используйте браузер без головы и очистите веб-сайт.См здесь .
...