通过外部软件创建的嵌入式网络抓取 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>
标签嵌入。
- 首先找到包含JSON学校的
script
标签
在 table. 中呈现的数据
- 然后找到确切的数据 JSON 'chartData' 来清理和处理数据,因为它是一个长字符串.
- 在出现
\r
回车符 return 的位置拆分字符串。
- 正在用字符串中的空白替换
\n
新行。
- 最终将与学校相关的数据保存在 .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 条记录被提取并转储到文件中。以下是示例数据屏幕截图。
我目前正在尝试从该网页 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>
标签嵌入。
- 首先找到包含JSON学校的
script
标签 在 table. 中呈现的数据
- 然后找到确切的数据 JSON 'chartData' 来清理和处理数据,因为它是一个长字符串.
- 在出现
\r
回车符 return 的位置拆分字符串。 - 正在用字符串中的空白替换
\n
新行。 - 最终将与学校相关的数据保存在 .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 条记录被提取并转储到文件中。以下是示例数据屏幕截图。