Python Web Scraper无法从网站获取完整数据

Python Web Scraper无法从网站获取完整数据,python,web-scraping,python-requests,urllib,Python,Web Scraping,Python Requests,Urllib,我正在尝试使用python创建一个献血营地数据库的网站 首先,在尝试从请求或urllib获取网站html源代码时,出现了一个SSl:certificate\u verify\u错误,我通过将请求的verify参数设置为False绕过了该错误。获取或为urllib创建未验证的上下文一个快速修复,这使我克服了错误,但当我看到检索到的源html代码时,我需要的表内容是空的,在网站源代码中,它们包含在tbody标记中,但我的requests.get命令只获取这些标记,而不获取它们之间的内容。我对刮削非常

我正在尝试使用python创建一个献血营地数据库的网站

首先,在尝试从请求或urllib获取网站html源代码时,出现了一个SSl:certificate\u verify\u错误,我通过将请求的verify参数设置为False绕过了该错误。获取或为urllib创建未验证的上下文一个快速修复,这使我克服了错误,但当我看到检索到的源html代码时,我需要的表内容是空的,在网站源代码中,它们包含在tbody标记中,但我的requests.get命令只获取这些标记,而不获取它们之间的内容。我对刮削非常陌生,希望您能给我一些指导。泰

从urllib.request导入urlopen作为uReq 导入ssl 从bs4进口美汤作为汤 我的https://www.eraktkosh.in/BLDAHIMS/bloodbank/campSchedule.cnt' sp\u context=ssl.\u创建\u未验证的\u上下文 uClient=uReqmy\u url,context=sp\u context page_html=uClient.read 客户端关闭 page_soup=souppage_html,html.parser table=page\u soup.查找'tbody' 打印此输出的表格 trow=表格。查找'tr' print trow此选项不输出任何内容 第一个print命令给出

和第二输出

None 

这是因为第一个请求返回一个几乎为空的html框架

您在页面上看到的数据由后续ajax请求填充。确切地说,是这个

您可以通过右键单击->检查->网络选项卡并重新加载页面来检索此信息

意见:从该页面提取信息不需要BeautifulSoup。上述API中的数据以json格式随时可用


希望这有帮助。

看看这个HTTP调用:

这就是数据的来源

您有两种选择:

执行HTTP调用并解析响应 使用无头浏览器浏览网站。看见 使用熊猫库将数据保存到csv文件中

在浏览器网络选项卡中,您将看到campSchedule表数据的JSON数据响应

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")
使用熊猫和可再生能源

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)

非常感谢。我还有一个问题。我猜几乎所有的网站都会使用类似于上述方法的方法来检索数据,那么在每个web scraping教程中给出的方法是如何没有提到这一点的,而他们又是如何以html格式获取数据的呢?只有使用JavaScript在客户端呈现数据的网站才需要这样处理。
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)