本网站https://aviation-safety.net/wikibase/ DB始于1902年至2022年。我试图为2015年和2016年的每起事故列出表格、叙述、可能原因和分类:https://aviation-safety.net/database/dblist.php?Year=2015。使用下面的代码,我只能抓取表:
import requests
from bs4 import BeautifulSoup
import pandas as pd
from datetime import datetime
import re
import concurrent.futures
import itertools
from random import randint
from time import sleep
def scraping(year):
headers = {
'accept':'*/*',
'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36',
}
url = f'https://aviation-safety.net/database/dblist.php?Year={year}&sorteer=datekey&page=1'
#sleep(randint(1,3))
req = requests.get(url, headers=headers)
soup = BeautifulSoup(req.text,'html.parser')
page_container = soup.find('div',{'class':'pagenumbers'})
pages = max([int(page['href'].split('=')[-1]) for page in page_container.find_all('a')])
#info = []
tl = []
for page in range(1,pages+1):
new_url = f'https://aviation-safety.net/database/dblist.php?Year={year}&lang=&page={page}'
print(new_url)
#sleep(randint(1,3))
data = requests.get(new_url,headers=headers)
soup = BeautifulSoup(data.text,'html.parser')
table = soup.find('table')
for index,row in enumerate(table.find_all('tr')):
if index == 0:
continue
link_ = 'https://aviation-safety.net/'+row.find('a')['href']
#sleep(randint(1,3))
new_page = requests.get(link_, headers=headers)
new_soup = BeautifulSoup(new_page.text, 'lxml')
table1 = new_soup.find('table')
for i in table1.find_all('tr'):
title = i.text
tl.append(title)
df= pd.DataFrame(tl)
df.columns = ['status']
df.to_csv(f'{year}_aviation-safety_new.csv', encoding='utf-8-sig', index=False)
if __name__ == "__main__":
START = 2015
STOP = 2016
years = [year for year in range(START,STOP+1)]
print(f'Scraping {len(years)} years of data')
with concurrent.futures.ThreadPoolExecutor(max_workers=60) as executor:
final_list = executor.map(scraping,years)
但数据没有组织。 Dataframe 如下所示:
结果应如下所示:
2条答案
按热度按时间ztmd8pv51#
看起来
tl
的值是字符串,例如'Status:Accident investigation report completed and information captured'
。将字符串列表转换为
pd.DataFrame
可以得到一个列,其中包含列表中的所有值。如果你想使用字符串的"name",例如
Status
作为列标题,你需要将它与文本的其余部分分开。这看起来像
现在我们创建一个字典
给我们
我们将在最后一个循环中添加到这个字典中
在我们从页面收集了所有数据之后,即完成了
row_dict
循环,我们将追加到tl
。现在大家一起
j91ykkif2#
read_html()方法提供了对此类数据集的方便访问。
很难控制user-agent头文件,所以要么使用一个合作站点,要么使用requests或curl做一些额外的工作来预先获得html文本。