自学内容网 自学内容网

网络爬虫之基于前面爬取百度图片代码的修改的总结

前言

关于bug这没啥好说的,程序员写代码怎么可能没有bug?有则改之,无则加勉嘛…
但是有些bug,真是让人头疼,就比如我之前的一篇文章 爬取百度图片,想爬谁就爬谁 ,这篇文章的代码其实也没什么问题,问题就出在返回的数据有问题,那怎么办,当bug改呗。

问题描述

爬虫爬到百度图片,我们手动请求后发现返回的数据其实是json,那好了,直接用requests模块,requests.get(url,headers).json()不就好了吗,问题就出在这。正常的json,就是那种标准的字典,键值对,值里面有引号进行转义什么的就ok了,但是百度返回的json不一样,key-value中,某些value它不正常,就不是json,如下:
在这里插入图片描述
怎么解决呢?具体问题具体分析。通过对整个数据的分析,把“ \’ ’”改成“ \\’ ”就好了。所以呢,我们还得引入json模块,为的就是数据解析替换后,还得把字符串转成json来操作

修改的部分的代码如下:
        resp=requests.get(url,headers=headers)                                                          
        # 通过手动浏览器访问确定是json数据了                                                                           
        # 最终的json对象或者说是字典对象                                                                             
        # 这里为什么不直接用  jsonData=resp.json()  ,是因为发现返回的数据居然不是正常的json字符串,有些地方是非法的,靠,真是服了                    
        jsonData={}                                                                                     
        # 先去拿到返回的json字符串                                                                                
        if resp.text:                                                                                   
            res=resp.text                                                                               
            # 把不对的地方改正确了                                                                                
            res=res.replace("\'","\\'")                                                                 
            try:                                                                                        
                # 将正确的json字符串转成json对象                                                                   
                jsonData=json.loads(res)                                                                
            except json.decoder.JSONDecodeError as e:                                                   
                #真出现异常了,咱就打印出来 看是哪的问题                                                                   
                print(res)                                                                              
                # 出现异常了也不要停啊,反正是爬的图片,不是还有正常的数据么,哇哈哈哈。。。                                                 
                continue                                                                                
        #jsonData=resp.json()                                                                           

好了,去测试一下
在这里插入图片描述

Perfect!

现在附上完整代码

# 需要发送请求
import requests
# 需要用来创建文件夹
import os
import json



# 定义函数去下载图片
def down_load_pics(search_name,pic_type):
    # 创建文件夹
    mkdir_dir_at_curr_path(search_name)
    #是否继续循环去下载
    flag=True
    # 确定是第几次下载
    request_count=0
    while(flag):
        print('第',request_count+1,'次下载中')
        # 获取url
        download_num=request_count*30
        url= get_url(search_name,download_num)

        # 获取请求头
        headers=get_headers()
        #发送请求获得响应数据
        resp=requests.get(url,headers=headers)
        # 通过手动浏览器访问确定是json数据了
        # 最终的json对象或者说是字典对象
        # 这里为什么不直接用  jsonData=resp.json()  ,是因为发现返回的数据居然不是正常的json字符串,有些地方是非法的,靠,真是服了
        jsonData={}
        # 先去拿到返回的json字符串
        if resp.text:
            res=resp.text
            # 把不对的地方改正确了
            res=res.replace("\'","\\'")                           
            try:
                # 将正确的json字符串转成json对象
                jsonData=json.loads(res)
            except json.decoder.JSONDecodeError as e:
                #真出现异常了,咱就打印出来 看是哪的问题
                print(res)
                # 出现异常了也不要挺啊,反正是爬的图片,不是还有正常的数据么,哇哈哈哈。。。
                continue
        #jsonData=resp.json()
        if 'data' not in jsonData or jsonData['data']==[] or jsonData['data']==[{}]:
            print('已经全部下载完成')
            # 下载完了就要跳出循环
            flag=False
            return
        # 有数据就去下载
        for item in jsonData['data']:
            if 'thumbURL' in item and 'fromPageTitleEnc' in item and search_name in item['fromPageTitleEnc']:
                # 图片的真正地址
                sub_url=item['thumbURL']
                if sub_url.startswith('http'):
                    response=requests.get(sub_url)
                    # 文件夹中文件数量,用来计算下载图片名称
                    file_size= len(os.listdir(search_name))
                    # 下载后图片名称下标
                    pic_index=file_size+1
                    #图片名称
                    curr_file_name=search_name+'_'+str(pic_index)
                    # 将下载好的图片数据保存到文件夹中
                    with open(str(search_name+'/'+curr_file_name)+'.'+pic_type,'wb') as f:
                        f.write(response.content)
                    print('第',pic_index,'张图片下载完成')
        # 准备下一次循环
        request_count = request_count + 1
def get_headers():
    return {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.114 Safari/537.36",
         "Access-Control-Allow-Credentials": "true",
         "Access-Control-Allow-Origin": "https://m.baidu.com, https://www.baidu.com, http://m.baidu.com,http://www.baidu.com",
         "Connection":"keep-alive",
         "Content-Encoding": "br",
         "Content-Type":"application/json"}
def get_url(search_name,page_size):
    url='https://image.baidu.com/search/acjson?tn=resultjson_com&logid=8332766429333445053&ipn=rj&ct=201326592&is=&fp=result&fr=&word='+search_name+'&queryWord='+search_name+'&cl=2&lm=&ie=utf-8&oe=utf-8&adpicid=&st=-1&z=&ic=&hd=&latest=&copyright=&s=&se=&tab=&width=&height=&face=0&istype=2&qc=&nc=1&expermode=&nojc=&isAsync=&pn='+str(page_size)+'&rn=30&gsm=3c&1721294093333='
    return url
# 在当前目录创建文件夹,咱就简单的弄吧,别搞复杂的
def mkdir_dir_at_curr_path(dir_name):
    try:
        os.mkdir(dir_name)
        print('文件夹:',dir_name,'创建成功')
    except FileExistsError:
        print('文件夹:',dir_name,'已经存在')

if __name__ == '__main__':
    down_load_pics('北川柚子','png')                       

总结一下

  • 遇到事情不要慌,先把心情平静下来,然后再思考
  • 程序员写bug这是常有的事,要有一颗平常心,罗马也不是一天建成的不是…
  • 对待bug要像对待你的GF一样,要耐心,要仔细,虽然低声下气解决了一个小矛盾,但是还要想到是不是还有其他的问题,如果我努力赚钱,是不是就能解决其他的问题???所以呢,我又增加了一个小心思,咱不指定一定要生成jpg图片了,咱设置成了参数,你爱生成什么格式就什么格式,你随意,你了不起…
  • 当然,还是得有bug啊,或者是看优化的点,比如一些安全性的校验我这里就不去改了,毕竟是要看客户的需求嘛,咱编程也得有防御性的啊…

原文地址:https://blog.csdn.net/u013673252/article/details/140546505

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!