![](/img/trans.png)
[英]How can i read these cells from an html code with python web-scraping?
[英]How can I optimize a web-scraping code snippet to run faster?
我写了这段代码,它目前正在运行,正在抓取大量数据。 到目前为止,循环已经运行了 800 次。 它必须运行约 16,000 次才能获取所有数据。
一般来说,我如何优化网络抓取代码,或者我是否受requests.get 的支配?
import json
import requests
import pandas as pd
from pandas.io.json import json_normalize
headers = {}
p = {}
a = int(p['page'])
df = pd.DataFrame()
while True:
p['page'] = str(a)
try:
a += 1
r = requests.get('URL',headers=headers, params=p)
complete_json = r.json()
print('success')
df_data = pd.DataFrame.from_dict(json_normalize(complete_json['explore_vintage']['matches']), orient='columns')
df = df.append(df_data)
except:
False
df.to_excel('output.xlsx', encoding='utf8')
df.to_csv("output.csv")
print(df.head)
我可以立即看到一些优化。
您可以在此处添加的第一件事是通过异步请求进行并行处理。 requests
库是同步的,正如您所看到的 - 它会一直阻塞,直到每个页面都完全处理完毕。 有一个数量的图书馆的requests
项目的正式建议。 如果你走这条路,你需要更明确地定义一个终止条件,而不是一个无限while
循环内的try
/ except
块。
这是主要从他们的示例中提取的所有伪代码,但您可以看到它是如何工作的:
from requests_futures.sessions import FuturesSession
from concurrent.futures import as_completed
import json
import time
def response_hook(resp, *args, **kwargs):
with open(f'tmp/{time.thread_time_ns()}.json', 'wb') as fp:
parsed = resp.json()
fp.write(json.dumps(parsed).encode('utf-8'))
futures_session = FuturesSession()
futures_session.hooks['response'] = response_hook
with futures_session as session:
futures = [
session.get(f'https://jsonplaceholder.typicode.com/todos/{i}', hooks={'response': response_hook}) for i in range(16000)
]
for future in as_completed(futures):
resp = future.result()
将数据解析为数据帧是一个明显的瓶颈。 随着数据帧变得越来越大,这目前将继续放缓。 我不知道这些 JSON 响应的大小,但如果您要获取 16k 响应,我想这会在您吃完记忆后迅速停止。 如果可能,我建议将抓取和转换操作解耦。 将所有抓取的数据保存到它们自己的独立 JSON 文件中(如上例所示)。 如果单独保存每个响应并且抓取完成,则可以遍历所有保存的内容,解析它们,然后输出到 Excel 和 CSV。 请注意,根据 JSON 文件的大小,您可能仍会遇到内存问题,您至少不会阻塞抓取过程,并且可以单独处理输出处理。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.