Próbuję pobrać kilka obrazów z przeglądarki awaryjnej NHTSA (CEREN CASE). Przykładem przypadku HTTPS: / /crashviewer.nhtsa.dot.gov/nass-ciren/caseForm.aspx?xsl=main.xsl&saseid=99817. Jeśli spróbuję pobrać obraz przedniego awarii, nie ma pliku pobrane. Używam bibliotek bibliotek BeautifulSoup4 i prośby. Ten kod działa dla innych stron internetowych.

Link obrazu znajduje się w następującym formacie: https://crashviewer.nhtsa.dot.gov/nass-ciren/getbinary.aspx?Image& ;imageId=555004572&casid=555003071& ;version=0

Próbowałem również poprzednie odpowiedzi od tego, ale nie działa rozwiązanie, otrzymany błąd: Brak serwera formularza odpowiedzi

Kod używany do skrobania internetowego

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



1
Hardik Manek 16 styczeń 2020, 02:07

1 odpowiedź

Najlepsza odpowiedź

Jest to zadanie wymagające selenu, ale na szczęście jest skrót. Na górze strony znajduje się link "Tekst i obrazy", który trafia do strony jak ta: https://crashviewer.nhtsa.dot.gov/nass-ciren/caseforform.aspx?ViewText&ssid=99817& ;xsl = textonly.xsl & amp; Webrc = true zawierający wszystkie obrazy i treść tekstu na jednej stronie. Możesz wybrać ten link za pomocą soup.find('a', text='Text and Images Only').

Ten link i linki obrazu są względne (linki do tej samej witryny są zazwyczaj względnymi linkami), więc musisz użyć urljoin(), aby uzyskać pełne adresy 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

Witryna nie zwraca poprawnych zdjęć, chyba że żądanie ma poprawne pliki cookie. Istnieją dwa sposoby na zdobycie plików cookie: albo użyj plików cookie z poprzedniego żądania lub użyj a Sessiion obiekt. Najlepiej jest użyć sesji, ponieważ obsługuje również połączenie TCP i inne parametry.

1
t.m.adam 17 styczeń 2020, 16:06