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

Web scraping for downloading images from NHTSA website (CIREN crash cases)

我正在尝试从 NHTSA Crash Viewer(CIREN 案例)下载一些图像。案例举例https://crashviewer.nhtsa.dot.gov/nass-CIREN/CaseForm.aspx?xsl=main.xsl&CaseID=99817 如果我尝试下载 Front 崩溃图像,则没有下载文件。我正在使用 beautifulsoup4 并请求库。此代码适用于其他网站。

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

我也尝试过 SO 之前的答案,但 none 解决方案有效,出现错误: 没有响应表单服务器

用于网页抓取的代码

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



这是一项需要 Selenium 的任务,但幸运的是有一个捷径。在页面的顶部有一个 "Text and Images Only" link 转到这样一个页面: https://crashviewer.nhtsa.dot.gov/nass-CIREN/CaseForm.aspx?ViewText&CaseID=99817&xsl=textonly.xsl&websrc=true 包含一页中的所有图像和文本内容。你可以 select 那 link 与 soup.find('a', text='Text and Images Only')

link 和图像 link 是相对的(link 到同一站点通常是相对的 link),因此您必须使用 urljoin() 获取完整的 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,否则网站不会 return 有效图片。有两种获取 cookie 的方法:使用来自先前请求的 cookie 或使用 Sessiion 对象。最好使用 Session,因为它还处理 TCP 连接和其他参数。