Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用curl或wget以csv或tsv格式获取此网页的内容_Curl_Web Scraping_Wget - Fatal编程技术网

如何使用curl或wget以csv或tsv格式获取此网页的内容

如何使用curl或wget以csv或tsv格式获取此网页的内容,curl,web-scraping,wget,Curl,Web Scraping,Wget,我有以下链接: 我想下载此数据库中的所有表,并将其转换为csv或tsv文件。是否有任何curl或wget命令允许我解析此数据库 像这样的 wget -r -np -k http://fsop.caac.gov.cn/g145/CARS/WebSiteQueryServlet\?method\=loadAircraftConditionsResultPage\&enterpriseName\=%E6%AD%A6%E6%B1%89%E8%88%AA%E8%BE%BE%E8%88%AA%E7

我有以下链接:

我想下载此数据库中的所有表,并将其转换为csv或tsv文件。是否有任何curl或wget命令允许我解析此数据库

像这样的

wget -r -np -k http://fsop.caac.gov.cn/g145/CARS/WebSiteQueryServlet\?method\=loadAircraftConditionsResultPage\&enterpriseName\=%E6%AD%A6%E6%B1%89%E8%88%AA%E8%BE%BE%E8%88%AA%E7%A9%BA%E7%A7%91%E6%8A%80%E5%8F%91%E5%B1%95%E6%9C%89%E9%99%90%E5%85%AC%E5%8F%B8\&licenceCode\=\&partsNumber\=\&partsName\=\&ataChaptersection\=

只获取网站代码,而不是表本身的内容。

如果需要json输出,则URL为

http://fsop.caac.gov.cn/g145/CARS/WebSiteQueryServlet?method=aircraftConditionsQuery&iColumns=10&sColumns=&iDisplayStart=0&iDisplayLength=20&mDataProp_0=enterpriseName&mDataProp_1=licenceCode&mDataProp_2=partsNumber&mDataProp_3=partsName&mDataProp_4=ataChaptersection&mDataProp_5=manufacturers&mDataProp_6=6&mDataProp_7=fileToAccord&mDataProp_8=mainDevices&mDataProp_9=remark&enterpriseName=%E6%AD%A6%E6%B1%89%E8%88%AA%E8%BE%BE%E8%88%AA%E7%A9%BA%E7%A7%91%E6%8A%80%E5%8F%91%E5%B1%95%E6%9C%89%E9%99%90%E5%85%AC%E5%8F%B8&licenceCode=&partsNumber=&partsName=&ataChaptersection=
在URL中,
iDisplayStart
参数中有分页,从0开始,有20个结果步骤

使用GNUparallel、jq和您可以下载所有内容并在CSV中转换

在示例中,要下载前6个json输出(从0到100),可以运行

echo {0..100..20} | tr " " "\n" | parallel -j0 'curl "http://fsop.caac.gov.cn/g145/CARS/WebSiteQueryServlet?method=aircraftConditionsQuery&iColumns=10&sColumns=&iDisplayStart={}&iDisplayLength=20&mDataProp_0=enterpriseName&mDataProp_1=licenceCode&mDataProp_2=partsNumber&mDataProp_3=partsName&mDataProp_4=ataChaptersection&mDataProp_5=manufacturers&mDataProp_6=6&mDataProp_7=fileToAccord&mDataProp_8=mainDevices&mDataProp_9=remark&enterpriseName=%E6%AD%A6%E6%B1%89%E8%88%AA%E8%BE%BE%E8%88%AA%E7%A9%BA%E7%A7%91%E6%8A%80%E5%8F%91%E5%B1%95%E6%9C%89%E9%99%90%E5%85%AC%E5%8F%B8&licenceCode=&partsNumber=&partsName=&ataChaptersection=" | jq -c '"'"'.aaData[]'"'"' >{}.jsonl'
mlr --j2c unsparsify *.jsonl >output.csv
在输出中,您将有6个json文件

要将它们合并到CSV中,可以运行

echo {0..100..20} | tr " " "\n" | parallel -j0 'curl "http://fsop.caac.gov.cn/g145/CARS/WebSiteQueryServlet?method=aircraftConditionsQuery&iColumns=10&sColumns=&iDisplayStart={}&iDisplayLength=20&mDataProp_0=enterpriseName&mDataProp_1=licenceCode&mDataProp_2=partsNumber&mDataProp_3=partsName&mDataProp_4=ataChaptersection&mDataProp_5=manufacturers&mDataProp_6=6&mDataProp_7=fileToAccord&mDataProp_8=mainDevices&mDataProp_9=remark&enterpriseName=%E6%AD%A6%E6%B1%89%E8%88%AA%E8%BE%BE%E8%88%AA%E7%A9%BA%E7%A7%91%E6%8A%80%E5%8F%91%E5%B1%95%E6%9C%89%E9%99%90%E5%85%AC%E5%8F%B8&licenceCode=&partsNumber=&partsName=&ataChaptersection=" | jq -c '"'"'.aaData[]'"'"' >{}.jsonl'
mlr --j2c unsparsify *.jsonl >output.csv

如果您想要一个json输出,URL是

http://fsop.caac.gov.cn/g145/CARS/WebSiteQueryServlet?method=aircraftConditionsQuery&iColumns=10&sColumns=&iDisplayStart=0&iDisplayLength=20&mDataProp_0=enterpriseName&mDataProp_1=licenceCode&mDataProp_2=partsNumber&mDataProp_3=partsName&mDataProp_4=ataChaptersection&mDataProp_5=manufacturers&mDataProp_6=6&mDataProp_7=fileToAccord&mDataProp_8=mainDevices&mDataProp_9=remark&enterpriseName=%E6%AD%A6%E6%B1%89%E8%88%AA%E8%BE%BE%E8%88%AA%E7%A9%BA%E7%A7%91%E6%8A%80%E5%8F%91%E5%B1%95%E6%9C%89%E9%99%90%E5%85%AC%E5%8F%B8&licenceCode=&partsNumber=&partsName=&ataChaptersection=
在URL中,
iDisplayStart
参数中有分页,从0开始,有20个结果步骤

使用GNUparallel、jq和您可以下载所有内容并在CSV中转换

在示例中,要下载前6个json输出(从0到100),可以运行

echo {0..100..20} | tr " " "\n" | parallel -j0 'curl "http://fsop.caac.gov.cn/g145/CARS/WebSiteQueryServlet?method=aircraftConditionsQuery&iColumns=10&sColumns=&iDisplayStart={}&iDisplayLength=20&mDataProp_0=enterpriseName&mDataProp_1=licenceCode&mDataProp_2=partsNumber&mDataProp_3=partsName&mDataProp_4=ataChaptersection&mDataProp_5=manufacturers&mDataProp_6=6&mDataProp_7=fileToAccord&mDataProp_8=mainDevices&mDataProp_9=remark&enterpriseName=%E6%AD%A6%E6%B1%89%E8%88%AA%E8%BE%BE%E8%88%AA%E7%A9%BA%E7%A7%91%E6%8A%80%E5%8F%91%E5%B1%95%E6%9C%89%E9%99%90%E5%85%AC%E5%8F%B8&licenceCode=&partsNumber=&partsName=&ataChaptersection=" | jq -c '"'"'.aaData[]'"'"' >{}.jsonl'
mlr --j2c unsparsify *.jsonl >output.csv
在输出中,您将有6个json文件

要将它们合并到CSV中,可以运行

echo {0..100..20} | tr " " "\n" | parallel -j0 'curl "http://fsop.caac.gov.cn/g145/CARS/WebSiteQueryServlet?method=aircraftConditionsQuery&iColumns=10&sColumns=&iDisplayStart={}&iDisplayLength=20&mDataProp_0=enterpriseName&mDataProp_1=licenceCode&mDataProp_2=partsNumber&mDataProp_3=partsName&mDataProp_4=ataChaptersection&mDataProp_5=manufacturers&mDataProp_6=6&mDataProp_7=fileToAccord&mDataProp_8=mainDevices&mDataProp_9=remark&enterpriseName=%E6%AD%A6%E6%B1%89%E8%88%AA%E8%BE%BE%E8%88%AA%E7%A9%BA%E7%A7%91%E6%8A%80%E5%8F%91%E5%B1%95%E6%9C%89%E9%99%90%E5%85%AC%E5%8F%B8&licenceCode=&partsNumber=&partsName=&ataChaptersection=" | jq -c '"'"'.aaData[]'"'"' >{}.jsonl'
mlr --j2c unsparsify *.jsonl >output.csv

它将类似于

,因为它有一个
web scraping
标记,我想如果您想从该站点中刮取所有表,您可以尝试一下
Python

我的意思是将所有
2347
页面合并到一个
.csv
文件中,该文件如下所示:

在继续讨论代码之前,我想与大家分享一个小小的免责声明:

下面的代码严重依赖多线程来请求数据 来自服务器,这可能导致连接拒绝/强制中断和/或禁止进一步连接

明智地使用它,并由您自己负责。

话虽如此,您实际上不必运行下面的代码,因为整个转储文件都可以按原样获取

这样,您就不会因为过度清理服务器而使服务器承受不必要的压力。但是,如果你想自己完成这项工作,下面是代码

守则:

导入工具
导入json
导入路径库
随机输入
导入时间
从concurrent.futures导入ThreadPoolExecutor
从pathlib导入路径,PurePath
从urllib.parse导入urlencode
作为pd进口熊猫
导入请求
BATCH_DIR=“/批次”
结果\u DIR=“/批次\u结果”
默认批次大小=250
def定时器(func):
@functools.wrapps(func)
def包装器定时器(*args,**kwargs):
开始时间=时间。性能计数器()
值=func(*args,**kwargs)
结束时间=时间。性能计数器()
运行时间=结束时间-开始时间
打印(f“在{run_time:.4f}秒内完成{func.\uuu name\uuuu!r}”)
返回值
返回包装器定时器
def build_有效载荷()->列表:
返回[
[
(‘方法’、‘飞机’),
(“iDisplayStart”,第页),
('iDisplayLength','20'),
(‘企业名称’,’武汉航达航空科技发展有限公司'),
]对于[i中的第i页,范围为(046921,10)]
]
def create_URL(有效载荷:列表)->列表:
基本url=”http://fsop.caac.gov.cn/g145/CARS/WebSiteQueryServlet?"
对于有效负载中的有效负载,返回[f“{base_url}{urlencode(有效负载)}”
定义URL到批次(URL:list,step:int=DEFAULT\u BATCH\u SIZE)->list:
为范围(0,len(URL),step)中的i返回[URL[i:i+step]
def准备批次(url批次:列表,批次目录:str=批次目录):
pathlib.Path(batch\u dir).mkdir(parents=False,exist\u ok=False)
对于编号,枚举中的批次(url\u批次,开始=1):
batch_file=PurePath(batch_dir).joinpath(f“batch_{number}.batch”)
打开(批处理文件“w”)作为输出:
out.writelines(“\n.join(批))
定义以前的_作业()->bool:
返回路径(批处理目录).exists()
def读取文件(批处理目录:str=批处理目录)->iter:
从(路径(batch_dir).iterdir()中的路径的路径)中生成
def打开批处理文件(批处理文件路径:路径)->列表:
将open(Path.joinpath(批处理文件路径))作为批处理文件:
为批处理文件中的行返回[line.strip().readlines()]
def get_数据(api_url:str)->列表:
return requests.get(api_url).json()[“aaData”]
@计时器
def线程(批处理URL:列表)->列表:
结果=[]
使用ThreadPoolExecutor()作为执行器:
对于[executor.submit(获取\u数据,url)中批量url的结果,\u url]:
results.extend(result.result())
返回结果
def转储线程结果(
结果:列表,
批处理文件路径:路径,
批处理结果:str=results\u DIR
):
pathlib.Path(批处理结果).mkdir(parents=False,exist\u ok=True)
output_file=f“{batch_file_path.name.rsplit('..')[0]}.json”
打开(PurePath(批处理结果)。joinpath(输出文件),“w”)作为输出:
dump(results,out,indent=4,sort\u keys=True)
def等待(开始:int=60,停止:int=180):
sleep\u for=random.randint(开始、停止)
打印(f“睡眠{睡眠}秒。”)
时间。睡眠(睡眠时间)
def刮取_数据():
对于读取文件()中的批处理:
打印(f“处理{批处理}…”)
打印(f“还剩下{len(list(read_files())}批。”)
尝试:
转储线程结果(线程(打开批处理文件(批处理)),批处理)
路径(批处理).unlink()
等等
除了(
requests.exceptions.ConnectionError,
requests.exceptions.ChunkedEncodingError,
)作为错误:
打印(f“连接失败:{error}”)
等待(开始=180,停止=360)
持续
路径(BATCH_DIR).rmdir()
def合并结果(文件名:str=“caac\U gov\U merged\U data.csv”):
合并的\u批处理\u结果=[]
对于读取文件中的结果文件(路径(结果目录)):
打开(结果文件)作为结果:
合并的批处理结果扩展(json.load(result))
数据帧(
合并的\u批处理\u结果
).放下(