请教这里的大佬,关于 Python 爬虫的 keyerror 的问题

2019-03-28 20:11:45 +08:00
 hfg123

想请教这里的大佬一个问题,在抓取图片的时候,想用 requests 库的 stream 参数显示一下下载进程,可是运行不久就会出现这种情况



说好像是没有 headers 里面没有 conent-length 我听说一般图片的贮存应该是有请求头的 content-length 参数的..如果出现这种结果应该咋办呢,抛出异常吗??感谢大佬们的帮忙.代码如下,小白一枚,语法不好

import os
import re
import sys
import time
import urllib
import requests
import threading
from hashlib import md5
from fake_useragent import UserAgent
from multiprocessing.pool import Pool


def image_parser(html):

    if html.get('items'):

        data = html.get('items')

        for item in data:  # 字典的遍历

            image_url = item.get('ori_pic_url')  # json 值的获取

            r1 = r'[\\/:*?"<>|.]'  # 去除非法文件命名
            image_titles = re.sub(r1, '-', item.get('title'))

            yield {
                'image_title': image_titles,

                'image_url': image_url
            }  # 运用 generator 生成字典


def save_image(item):

    img_path = 'imgs' + os.path.sep + item.get('image_title')
    # 于上面的函数不一样,只能调用 yeild 生成器的值,不要用作 item.get (‘ orinigl_url')

    print("获取路径成功")


    if img_path[0:50]:  # 字符串的截取,解决文件名过长的导致无法建立文件夹

        if not os.path.exists(img_path):  # 谨记加 not,否则找不到文件

            os.makedirs(img_path)

        try:
            start = time.time()

            size = 0

            resp = requests.get(item.get('image_url'),stream=True,allow_redirects=False)

            chunk_size = 1024

            if resp.status_code == 200:

                file_path = img_path + os.path.sep + '{file_name}.{file_suffix}'.format(
                    file_name=md5(resp.content).hexdigest(),
                    file_suffix='jpg')

                if not os.path.exists(file_path):  # 谨记加 not,建立新文件
                    

                    try:  
                        content_size = int(resp.headers['content-length'])
#这里出现的问题
                        print('[文件大小]:%0.2f MB' %(content_size / chunk_size /1024))

                        with open(file_path, 'wb')as f:

                            for data in resp.iter_content(chunk_size=chunk_size):

                                f.write(resp.content)

                                size += len(data)

                            print('\r'+'[下载进度] :%s%0.2f%%'%('>'*int(size*50/content_size),float(size/content_size*100)),end='')
                            
                            print('图片保存成功!!')

                            end=time.time()

                            print('\n'+"下载完成! 用时%0.2f"%(end-start))
                    except Exception :

                        print("url:{}".format(item.get('image_url')))
                else:

                    print("Download fail", file_path)

        except requests.ConnectionError:

            print("ConnectionError")

            return None


def image_get(url):

    try:

        headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.96 Safari/537.36',
                   'Host': 'pic.sogou.com'}

        response = requests.get(url, headers=headers,allow_redirects=False)
#防止重定向
        if response.status_code == 200:

            return response.json()

            

    except requests.ConnectionError as e:

        print("Download fail:{}".format(e.args))

        return None


def main():
    
    word = str(input("请输入抓取关键字:"))

    page = int(input("请输入抓取的页数:"))

    words = urllib.parse.quote(word, encoding='gbk')

    url = r'https://pic.sogou.com/pics?query='+words+r'&mode=1&start=' + \
        str(page*48)+r'&reqType=ajax&reqFrom=result&tn=0'

    html = image_get(url)

    for item in image_parser(html):

        print(item)

        save_image(item)



if __name__ == '__main__':
    
    main()

    
    time.sleep(3)

1229 次点击
所在节点    Python
2 条回复
julyclyde
2019-03-28 23:25:46 +08:00
不一定有啊
hfg123
2019-04-06 01:24:52 +08:00
还有大佬解析一下吗?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/549676

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX