通过外部软件创建的嵌入式网络抓取 table

Web scraping embedded table created through external software

我目前正在尝试从该网页 https://www.courthousenews.com/distance-learning-poses-challenges-for-schools-and-families-during-outbreak/ 上的“查找您的学区缺乏互联网”table 中提取所有条目。 table 是在可视化平台 Datawrapper 中创建的,因此 JavaScript hack 似乎不起作用。

任何关于我如何继续的想法都将不胜感激。提取数据的适当格式不是必需的,但循环浏览 1332 页的方法会很好。谢谢!

Scraped 来自 link https://datawrapper.dwcdn.net/FJJmb/2/ 的 table 可以在网站上找到,用于使用 <iframe> 标签嵌入。

  1. 首先找到包含JSON学校的script标签 在 table.
  2. 中呈现的数据
  3. 然后找到确切的数据 JSON 'chartData' 来清理和处理数据,因为它是一个长字符串.
  4. 在出现 \r 回车符 return 的位置拆分字符串。
  5. 正在用字符串中的空白替换 \n 新行。
  6. 最终将与学校相关的数据保存在 .csv 文件中。

Do mention system path in file_path variable before running the script.

import json
import requests
from urllib3.exceptions import InsecureRequestWarning
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
from bs4 import BeautifulSoup as bs
import csv
import re

def scrape_table_data():

list_of_schools = []
file_path = ''#mention your system path where you have to save the file
file_name = 'schools_list.csv'
url = 'https://datawrapper.dwcdn.net/FJJmb/2/'

page = requests.get(url,verify=False)
soup = bs(page.text, 'lxml')
data = soup.find_all('script', type='text/javascript',charset="utf-8")[5].text
txt = re.findall(r'chartData\s*:\s*(".*")', data)
sanitize_string = txt[0].split(r'\r')

csv_headers = ['#','School District','Pct. No internet','Pct. with internet','Pct. No computers']

for idx, school_data in enumerate(sanitize_string):
    if idx > 0:
        stripped_data = school_data.replace(r'\n', '').replace('\', '').split(',')
        list_of_schools.append({
                                '#':idx,
                                'School District':stripped_data[0] + ',' + stripped_data[1],
                                'Pct. No internet': stripped_data[2],
                                'Pct. with internet': stripped_data[3],
                                'Pct. No computers': stripped_data[4]
                                })
       
with open(file_path + file_name ,'a+') as schools_CSV:
    csvwriter = csv.DictWriter(schools_CSV, delimiter=',', lineterminator='\n',fieldnames=csv_headers)

    print('Writing CSV header now...')
    csvwriter.writeheader()

    #iterate over the list and save the data in file
    for item in list_of_schools:
        print('Writing data rows now..')
        print(item)            
        csvwriter.writerow(item)

scrape_table_data()

有 13315 条记录被提取并转储到文件中。以下是示例数据屏幕截图。