python3爬虫遇到报错 “urlopen error no host given”

程序是爬百度图片搜索范冰冰的所有图片。Notepad已经选择了UTF8编码,URL地址也没有回车分行。
直接上代码如下:
import urllib.request
import re
import sys
import os
import urllib
import ssl
#根据给定的网址来获取网页详细信息,得到的html就是网页的源代码

def getHtml(url):
page = urllib.request.urlopen(url)
html = page.read()
return html.decode('utf-8')

def getImg(html):
imglist = re.findall('"ObjURL":"(.*?)",', html, re.S)#表示在整个网页中过滤出所有图片的地址,放在imglist中
x = 0
path = 'D:\test'

# 将图片保存到D:\test文件夹中,如果没有test文件夹则创建
if not os.path.isdir(path):

os.makedirs(path)

paths = path+'\' #保存在test路径下

for imgurl in imglist:  
    urllib.request.urlretrieve(imgurl,'D:\\test\\%s.jpg' % x)  #打开imglist中保存的图片网址,并下载图片保存在本地,format格式化字符串 
    x = x + 1  
return imglist

url="http://image.baidu.com/search/index?tn=baiduimage&ps=1&ct=201326592&lm=-1&cl=2&nc=1&ie=utf-8&word=%E8%8C%83%E5%86%B0%E5%86%B0"
html=getHtml(url)
print (getImg(html)) #从网页源代码中分析并下载保存图片

3个回答

感谢楼上回复。问题仍然没有解决,我很奇怪的是,前些天还可以正常运行,今天就不行了。您可以运行这个脚本吗?

caozhy
贵阳老马马善福专业维修游泳池堵漏防水工程 你编辑下代码,用</>按钮格式化,现在的代码没有缩进,很多地方都乱了。
11 个月之前 回复

1.使用'"ObjURL":"查找的图片地址很多都是无效的,所以会urlopen error no host given出错;
2.图片网站有反爬机制,需要添加headers头,亲测以下代码可运行:

import os
import re
import requests
import urllib
def getHtml(url):
    page = urllib.request.urlopen(url)
    html = page.read()
    return html.decode('utf-8')

def getImg(html):
    imglist = re.findall('"thumbURL":"(.*?)",', html, re.S)#表示在整个网页中过滤出所有图片的地址,放在imglist中
    x = 0
    path = 'D:\test\\'
    #
    # # 将图片保存到D:\test文件夹中,如果没有test文件夹则创建
     if not os.path.isdir(path):
        os.makedirs(path)
       path = path+'\\' #保存在test路径下
    headers={
'Referer':'http://image.baidu.com/search/index?tn=baiduimage&ps=1&ct=201326592&lm=-1&cl=2&nc=1&ie=utf-8&word=%E8%8C%83%E5%86%B0%E5%86%B0',
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:61.0) Gecko/20100101 Firefox/61.0'

    }
    s=requests.session()
    s.headers.update(headers)
    for imgurl in imglist:
        #urllib.request.urlretrieve(imgurl,'D:\\test\\%s.jpg' % x)  #打开imglist中保存的图片网址,并下载图片保存在本地,format格式化字符串
        x = x + 1
        img=s.get(url=imgurl)
        print(img)
        with open(path+'%s.jpg' % x, 'wb') as file:
            file.write(img.content)
    return imglist

url="http://image.baidu.com/search/index?tn=baiduimage&ps=1&ct=201326592&lm=-1&cl=2&nc=1&ie=utf-8&word=%E8%8C%83%E5%86%B0%E5%86%B0"
html=getHtml(url)
print (getImg(html)) #从网页源代码中分析并下载保存图片 

如果答案对你有帮助,麻烦采纳下!!!

weixin_39416561
lyhsdy 回复weixin_43408134: 不用页面规则设置不一致,具体看站长心情。如果答案对你有帮助,麻烦采纳下!!
11 个月之前 回复
weixin_43408134
raid吾 再请教个问题,我发现打开直接打开百度图片,然后数据范冰冰获得的URL就可以直接用静态方式爬取,不用加header。但是在百度主页面搜索范冰冰,再点击图片,这样获得的URL就需要加header。这个是啥原因啊?谢谢!
11 个月之前 回复
weixin_39416561
lyhsdy 回复weixin_43408134: 如果答案对你有帮助,麻烦采纳下!!!
11 个月之前 回复
weixin_43408134
raid吾 非常给力,代码运行成功!跟您学习了!
11 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!