python - 如何迭代每个链接以抓取 HTML 中的所有数据框?
问题描述
我通过链接列表抓取一个网站,总共 442 个链接。在每个链接中都有数据框,通过使用 pd.read_html() 我设法拉出数据框。因此,我尝试循环所有链接并抓取所有数据框并加入它们,但是在完成所有操作后,我发现某些链接的数据框位置不同,我无法提取数据框。我该如何解决这个问题。很抱歉,如果我无法清楚地解释它,但这是我的脚本:
allin = []
for link in titlelink :
driver.get(link)
html = driver.page_source
soup = bs(html, 'html.parser')
iframe = soup.find('iframe')['src']
#open iframe
openiframe = driver.get(iframe)
iframehtml = driver.page_source
print('fetching --',link)
#using pandas read html ang get table
All = pd.read_html(iframehtml)
try :
table1 = All[1].set_index([0, All[1].groupby(0).cumcount()])[1].unstack(0)
except :
table1 = All[2].set_index([0, All[2].groupby(0).cumcount()])[1].unstack(0)
try :
table2 = All[3].set_index([0, All[3].groupby(0).cumcount()])[1].unstack(0)
except :
pass
df = table1.join(table2)
try :
df['Remarks'] = All[2].iloc[1]
except :
df['Remarks'] = All[3].iloc[1]
allin.append(df)
finaldf = pd.concat(allin, ignore_index=True)
print(finaldf)
finaldf.to_csv('data.csv', index=False)
另外,我已将所有链接导出到 csv 并附在此处(https://drive.google.com/file/d/1Tk2oKVEZwfxAnHIx3p2HbACE6vOrJq5A/view?usp=sharing),以便您获得更清晰的图片我面临的问题。感谢您的所有帮助。
解决方案
我在链接中找到了一些模式,所以我尝试了这个,现在工作正常。不是 100% 完美,但它正在工作,95%。这是代码:
import pandas as pd
import requests
df=pd.read_csv("link.csv") # That google drive document
links=df["0"].values.tolist()
for link in links:
nlink=f"https://disclosure.bursamalaysia.com/FileAccess/viewHtml?e={link.split('ann_id=')[1]}"
page=requests.get(nlink,headers={"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.1.1 Safari/605.1.15"})
df=pd.read_html(page.text)
df=pd.concat(df[1:],axis=0).to_numpy().flatten()
df=pd.DataFrame(df[~pd.isna(df)].reshape(-1,2))
# For explanation about these last two line you may check here https://stackoverflow.com/questions/68479177/how-to-shift-a-dataframe-element-wise-to-fill-nans
print(df)
您必须根据需要更改大部分内容。如果您需要任何帮助,您可以在评论中提问。从技术上讲,这不是一个完整的答案,但它可以加快你的抓取速度,也可以提供你想要的输出,但并不完全。您可以将其作为解决 90% 到 95% 问题的建议和想法。
推荐阅读
- flink-streaming - Flink:在类路径中找不到适合“org.apache.flink.table.factories.DeserializationSchemaFactory”的表工厂
- react-native - Thunks 未出现在 React Native 调试器的操作列表中
- javascript - JavaScript 按钮启用和禁用
- python - 我如何正确使用 isinstance()
- ruby-on-rails - 在 ruby on rails 中查询关联表
- java - 如何创建视频和图像的 ListView?
- c# - Type.GetProperties 不从基类型返回非虚拟重新定义的属性
- powershell - 用于不同 Cmdlet 的规范 Powershell 参数飞溅
- python-3.x - NLP中列表或文件的单词总数(列表长度)与词汇表之间的差异?
- android - 如果我的应用程序之前处于草稿状态,是否可以上传针对新密钥库签名的新应用程序?