从NHTSA网站下载图像的网络抓取(CIREN崩溃案例)

2024-10-06 12:18:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图从NHTSA崩溃查看器(CIREN案例)下载一些图像。案例https://crashviewer.nhtsa.dot.gov/nass-CIREN/CaseForm.aspx?xsl=main.xsl&CaseID=99817的一个例子 如果我尝试下载正面碰撞图像,则没有下载任何文件。我正在使用beautifulsoup4和请求库。此代码适用于其他网站

图像链接的格式如下:https://crashviewer.nhtsa.dot.gov/nass-CIREN/GetBinary.aspx?Image&ImageID=555004572&CaseID=555003071&Version=0

我也尝试过SO之前的答案,但没有一个解决方案有效,错误如下: 无响应表单服务器

用于web抓取的代码

from bs4 import *
import requests as rq
import os

r2 = rq.get("https://crashviewer.nhtsa.dot.gov/nass-CIREN/GetBinary.aspx?Image&ImageID=555004572&CaseID=555003071&Version=0")
soup2 = BeautifulSoup(r2.text, "html.parser")

links = []

x = soup2.select('img[src^="https://crashviewer.nhtsa.dot.gov"]')

for img in x:
    links.append(img['src'])

os.mkdir('ciren_photos')
i=1

for index, img_link in enumerate(links):
    if i<=200:
        img_data = rq.get(img_link).content
        with open("ciren_photos\\"+str(index+1)+'.jpg', 'wb+') as f:
            f.write(img_data)
        i += 1
    else:
        f.close()
        break




Tags: https图像importimglinksdot案例gov
1条回答
网友
1楼 · 发布于 2024-10-06 12:18:22

这是一项需要硒元素的任务,但幸运的是有一条捷径。在页面顶部有一个“仅限文本和图像”链接,指向这样一个页面:https://crashviewer.nhtsa.dot.gov/nass-CIREN/CaseForm.aspx?ViewText&CaseID=99817&xsl=textonly.xsl&websrc=true,该页面包含一个页面中的所有图像和文本内容。您可以使用soup.find('a', text='Text and Images Only')选择该链接

该链接和图像链接是相对的(指向同一站点的链接通常是相对链接),因此您必须使用^{}来获取完整的URL

from bs4 import BeautifulSoup
import requests as rq
from urllib.parse import urljoin

url = 'https://crashviewer.nhtsa.dot.gov/nass-CIREN/CaseForm.aspx?xsl=main.xsl&CaseID=99817'

with rq.session() as s:
    r = s.get(url)
    soup = BeautifulSoup(r.text, "html.parser")

    url = urljoin(url, soup.find('a', text='Text and Images Only')['href'])
    r = s.get(url)
    soup = BeautifulSoup(r.text, "html.parser")

    links = [urljoin(url, i['src']) for i in soup.select('img[src^="GetBinary.aspx"]')]

    for link in links:
        content = s.get(link).content
        # write `content` to file

因此,除非请求具有有效的cookie,否则该站点不会返回有效的图片。获取cookie有两种方法:使用来自前一个请求的cookie或使用^{}对象。最好使用会话,因为它还处理TCP连接和其他参数

相关问题 更多 >