Python 网站抓取-网站上的图像

Python 网站抓取-网站上的图像,python,web-scraping,beautifulsoup,Python,Web Scraping,Beautifulsoup,我正在学习来自的教程,名为 网络抓取(Python)简介-第04课(下载图像) 下面是我在Ubuntu 16.04操作系统上运行的代码: import urllib from urllib2 import urlopen, build_opener from bs4 import BeautifulSoup def make_soup(url): thepage = urlopen(url) opener = build_opener() opener.addhead

我正在学习来自的教程,名为

网络抓取(Python)简介-第04课(下载图像)

下面是我在Ubuntu 16.04操作系统上运行的代码:

import urllib
from urllib2 import urlopen, build_opener
from bs4 import BeautifulSoup

def make_soup(url):
    thepage = urlopen(url)

    opener = build_opener()
    opener.addheaders = [('User-Agent', 'Mozilla/5.0')]
    response = opener.open('https://www.imdb.com/search/name?gender=male,female&ref_=nv_tp_cel_1')
    soupdata = BeautifulSoup(thepage, "html.parser")
    return soupdata

soup = make_soup("https://www.imdb.com/search/name?gender=male,female&ref_=nv_tp_cel_1")

i=1

for img in soup.findAll('img'):
    print(img.get('src'))

    filename=str(i)
    i=i+1

    #urllib.urlretrieve(img.get('src'),filename)
    imagefile = open(filename + ".jpeg", 'wb')
    theLink = urllib.urlopen(img.get('src'))
    imagefile.write(theLink.read())
    imagefile.close()
它似乎下载了所有图像,但当我尝试打开其中任何图像时,我得到:

无法加载图像“1.jpeg”。解释JPEG图像文件时出错(不是 JPEG文件:以0x3c(0x21)开头

如果我运行
less1.jpeg
我会得到:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<HTML><HEAD><META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
<TITLE>ERROR: The request could not be satisfied</TITLE>
</HEAD><BODY>
<H1>403 ERROR</H1>
<H2>The request could not be satisfied.</H2>
<HR noshade size="1px">
Bad request.

<BR clear="all">
<HR noshade size="1px">
<PRE>
Generated by cloudfront (CloudFront)
Request ID: 9aEqiCgrzrSAsiL9Q8uvHlgu4SAaDxdBNclFG3AJjxtKn1R7RA35-A==
</PRE>
<ADDRESS>
</ADDRESS>
</BODY></HTML>

错误:无法满足请求
403错误
这项要求未能得到满足。

请求错误。

由cloudfront生成(cloudfront) 请求ID:9aEqiCgrzrSAsiL9Q8uvHlgu4SAaDxdBNclFG3AJjxtKn1R7RA35-A==

我的目标是从该网站下载所有图片,我尝试了其他网站,但没有成功。

下面的代码可能会帮助您:

import requests, urllib.request
from bs4 import BeautifulSoup

# Make HTTP request
url = "https://www.imdb.com/search/name/?gender=male,female&ref_=nv_tp_cel_1"
response = requests.get(url)
print(response.status_code)

# Parse HTML
soup = BeautifulSoup(response.content, 'html.parser')
response.close()

lister_list = soup.find('div',{"class":"lister-list"})
lister_items = lister_list.find_all("div",{"class":"lister-item"})

for i in lister_items:
    image = {}

    # Find image info inside each item
    image['item'] = i.find("div",{"class":"lister-item-image"}).find("img")
    image['alt'] = image['item']['alt']
    image['src'] = image['item']['src']

    # Save image
    urllib.request.urlretrieve(str(image['src']), f"{image['alt']}.jpg")

可能看到也可能看到你正在抓取的网站可能有专门的程序来防止这种图像抓取。这就是为什么您在这里实际保存的是每个图像的错误页面,而不是图像本身。很可能网站通过请求头知道请求来自脚本而不是浏览器。尝试更改标题,阅读以下内容:只要确保“用户代理”标题类似于真实的浏览器,就可以克服网站阻止web抓取的问题。不确定这是否适用于IMDB,但这是我必须为其他网站做的事情。