精华内容
下载资源
问答
  • python爬虫爬取百度图片开发环境涉及的知识点ostimeurllib.errorquotere(.*?)re.compile(key)代码实现 开发环境 日期:2021.9.11 开发环境:python 3.9和pycharm ps:pycharm今天第一次用,随着将越来越多开发环境...

    10.25
    百度页面改了,方法失效了

    开发环境

    1. 日期:2021.9.11
    2. 开发环境:python 3.9和pycharm
      ps:pycharm今天第一次用,随着将越来越多开发环境集成到vscode上,感觉太复杂了,配置又不太懂,总是有问题,虽然很喜欢vscode的自由度,但不想折腾了,简单的开发环境更重要!
    3. 第三方库:
    • requests 2.25.1
    • urlibs 1.26.4

    涉及的知识点

    os

    用来实现对文件的操作
    第一个函数:检测文件是否存在
    第二个函数用来新建文件

    os.path.exists(base_dir)
    os.mkdir
    

    time

    用来延时,防止封 ip

    time。sleep(1#延时1ms
    

    urllib.error

    当图片网址失效时,用以实现 异常检测,使程序不中断,继续爬下一个图片,同时输出异常

    try:
           # 爬取代码    
    except urllib.error.URLError:
    	print("下载失败")
    

    quote

    URL只允许一部分ASCII字符,其他字符(如汉字)是不符合标准的,此时就要进行编码。

    将搜素内容进行编码

    keyword = quote("猫", encoding='utf-8')
    #最终编码的后的是  %E7%8C%AB  (没看错就是这样一串字符)
    

    re

    正则表达式
    查看百度图片的源码可找到图片的地址
    在这里插入图片描述
    这里相当于去获取https://img1.baidu.com/it/u=1225680675,2635144528&fm=26&fmt=auto&gp=0.jpg

    注意见面的 r ,所以’ ‘单引号是字符串 ,而里面的 双引号就是单纯的双引号字符
    查找的是括号里面的内容

    r'thumbURL":"(.*?)"'
    
    "thumbURL":"https://img1.baidu.com/it/u=1225680675,2635144528&fm=26&fmt=auto&gp=0.jpg"
    

    (.*?)

    再讲讲这个
    正则表达式中的 .? 或 .+

    后边多一个?表示懒惰模式。
    必须跟在*或者+后边用
    如:

    <img src="test.jpg" width="60px" height="80px"/>

    如果用正则匹配src中内容非懒惰模式匹配

    src=".*"

    匹配结果是:
    src="test.jpg" width="60px" height="80px"
    意思是从 =" 往后匹配,直到最后一个 " 匹配结束

    懒惰模式正则:
    src=".*?"
    结果:src="test.jpg"
    匹配到第一个"就结束了一次匹配。不会继续向后匹配。因为他懒惰嘛。

    re.compile(key)

    预编译,不用每次find的时候去编译

    代码实现

    首先是import 需要使用的库

    import os
    import urllib.request
    from urllib.parse import quote
    import re
    import urllib.error
    import requests
    import time
    

    首先,不想每次都手动复制cookie,所以先进入百度知道界面获取 cookie

    get_cookie_headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
                                      "Chrome/92.0.4515.159 Safari/537.36 "}
    get_cookie_html = "https://www.baidu.com/?tn=49055317_4_hao_pg"
    get_cookie_target = requests.session()
    cookie_target = get_cookie_target.get(get_cookie_html, headers=get_cookie_headers)
    cookie = requests.utils.dict_from_cookiejar(cookie_target.cookies)
    print(cookie)
    

    然后打印出来可以发现,格式是字典,并不是我们想要的格式在这里插入图片描述
    于是,我们将其简单处理一下变成我们需要的格式

    key = []
    value = []
    result_cookie = ""
    
    for i in cookie.keys():
        key.append(i)
    
    for i in cookie.values():
        value.append(i)
    
    for i in range(len(key)):
        result_cookie += key[i] + '=' + value[i] + ";"
    
    print(result_cookie)
    myheaders = {
        "Cookie": result_cookie,
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
                      "Chrome/92.0.4515.159 Safari/537.36 "
    }
    

    接下来就是 获取输入关键字 并建立文件夹

    pic_dir_name = input("输入想要爬取的主题:")
    base_dir = r"C:\Users\dawn\Desktop\百度图片/"
    #pic_dir_name = "猫"
    
    pic_dir = base_dir + pic_dir_name
    
    if os.path.exists(base_dir):
        if os.path.exists(pic_dir):
            print(pic_dir + "  文件已存在")
        else:
            os.mkdir(pic_dir)
    else:
        os.mkdir(base_dir)
        os.mkdir(pic_dir)
    
    

    这里去建立 图片的链接 和正则表达式
    链接里面的
    pn是值图片的开始 值 ,0指第一张
    rn指每次服务器给你的图片数量,一次最多60

    keyword = quote(pic_dir_name, encoding='utf-8')
    
    start_number = 0
    base_url = "https://image.baidu.com/search/acjson?tn=resultjson_com&ipn=rj&queryWord=" + keyword + "&word=" + keyword + "&pn%d=&rn=60" % start_number
    key = r'thumbURL":"(.*?)"'
    pic_url = re.compile(key)  # 预编译
    

    进行循环,爬取,并保存在文件夹

    number = 1
    while start_number < 1800:
        response = urllib.request.Request(base_url, headers=myheaders)
        result = urllib.request.urlopen(response).read().decode("utf-8")
        for i in re.findall(pic_url, result):
            print(i)
            try:
                response = urllib.request.Request(i, headers=myheaders)
                pic_result = urllib.request.urlopen(response).read()
                with open(pic_dir + "/" + pic_dir_name + str(number) + ".jpg", "wb+") as f:
                    f.write(pic_result)
                number += 1
                time.sleep(0.5)
            except urllib.error.URLError:
                print("下载失败")
        start_number += 60
    
    
    展开全文
  • #最好用的一个 ...# 百度图片URL解码 # http://blog.csdn.net/hbuxiaoshe/article/details/44780653 str_table = { '_z2C$q': ':', '_z&e3B': '.', 'AzdH3F': '/' } char_table = { 'w': 'a', 'k': 'b',
  • 第一步:登录百度图片官网,截图如下所示: 注意点一:开头必须是https(如上图所示,出现锁的标志),不能是http,否则后期下载图片文件会出错 第二步:输入关键字,页面加载出来之后,按F12进入开发者模式,由于百度图片ajax...
  • Python爬虫爬取百度图片

    千次阅读 2020-06-09 11:44:08
    爬虫爬取百度图片 这是一个爬取百度图片的爬虫,在“ ”内输入你想要下载的图片,则会自动新建一个文件夹,把图片下载到这个文件夹中,爬取图片的多少取决于不同搜索词,如果图片足够了可以关闭运行窗口来结束运行。...

    爬虫爬取百度图片

    这是一个爬取百度图片的爬虫,在“ ”内输入你想要下载的图片,则会自动新建一个文件夹,把图片下载到这个文件夹中,爬取图片的多少取决于不同搜索词,如果图片足够了可以关闭运行窗口来结束运行。
    代码如下:

    from urllib.parse import urlencode
    import requests
    import re
    import os
    save_dir='baidutu/'
    
    def  baidtu_uncomplie(url):
        res = ''
        c = ['_z2C$q', '_z&e3B', 'AzdH3F']
        d= {'w':'a', 'k':'b', 'v':'c', '1':'d', 'j':'e', 'u':'f', '2':'g', 'i':'h', 't':'i', '3':'j', 'h':'k', 's':'l', '4':'m', 'g':'n', '5':'o', 'r':'p', 'q':'q', '6':'r', 'f':'s', 'p':'t', '7':'u', 'e':'v', 'o':'w', '8':'1', 'd':'2', 'n':'3', '9':'4', 'c':'5', 'm':'6', '0':'7', 'b':'8', 'l':'9', 'a':'0', '_z2C$q':':', '_z&e3B':'.', 'AzdH3F':'/'}
        if(url==None or 'http' in url):
            return url
        else:
            j= url
            for m in c:
                j=j.replace(m,d[m])
            for char in j:
                if re.match('^[a-w\d]+$',char):
                    char = d[char]
                res= res+char
            return res
    
    def get_page(offset):
        params = {
            'tn': 'resultjson_com',
            'ipn': 'rj',
            'ct': '201326592',
            'is': '',
            'fp': 'result',
            'queryWord':'鞠婧祎',
            'cl': '2',
            'lm': '-1',
            'ie': 'utf-8',
            'oe': 'utf-8',
            'adpicid': '',
            'st': '-1',
            'z':'0',
            'ic': '',
            'hd': '',
            'latest': '',
            'copyright': '',
            'word': '鞠婧祎',
            's': '',
            'se': '',
            'tab': '',
            'width': '',
            'height': '',
            'face': '0',
            'istype':'2',
            'qc': '',
            'nc': '1',
            'fr': '',
            'expermode': '',
            'force': '',
            'pn':offset*30,
            'rn': '250',
            'gsm': '1e',
            '1586072244704': '',
        }
        url = 'http://image.baidu.com/search/acjson?'+urlencode(params)
        try:
            response = requests.get(url)
            if response.status_code == 200:
                return response.json()
        except requests.ConnectionError as e:
            print('Error', e.args)
    
    
    def get_images(json):
        if json.get('data'):
            for item in json.get('data'):
                if item.get('fromPageTitle'):
                    title = item.get('fromPageTitle')
                else:
                    title='noTitle'
                image = baidtu_uncomplie(item.get('objURL'))
                if(image):
                    yield {
                        'image': image,
                        'title': title
                    }
     
    def save_image(item,count):
        try:
            response = requests.get(item.get('image'))
            if response.status_code == 200:
                file_path = save_dir+'{0}.{1}'.format(str(count), 'jpg')
                if not os.path.exists(file_path):
                    with open(file_path, 'wb') as f:
                        f.write(response.content)
                else:
                    print('Already Downloaded', file_path)
        except requests.ConnectionError:
            print('Failed to Save Image')
     
    def main(pageIndex,count):
        json = get_page(pageIndex)
        for image in get_images(json):
            save_image(image, count)
            count += 1
        return count
     
    if __name__=='__main__':
        if not os.path.exists(save_dir):
            os.mkdir(save_dir)
        count=1
        for i in range(1,20):
            count=main(i,count)
        print('total:',count)
        
    
    
    

    可以通过自行更改搜索词来下载需要的图片:
    在这里插入图片描述
    运行结果如下:

    在这里插入图片描述
    在这里插入图片描述
    这里以鞠婧祎为例下载了391张图片。

    展开全文
  • 本文主要介绍了Python爬虫:通过关键字爬取百度图片的方法。具有很好的参考价值,下面跟着小编一起来看下吧
  • python爬虫爬取百度图片

    千次阅读 2020-08-22 08:45:14
    python爬虫爬取百度图片 话不多说,直接上代码! import requests import re headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147....

    用python爬虫爬取百度图片

    话不多说,直接上代码!

    import requests
    import re
    
    headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.125 Safari/537.36 Edg/84.0.522.61"}
    
    def GetPictures(pic):
        url = "https://image.baidu.com/search/index?tn=baiduimage&ct=201326592&lm=-1&cl=2&ie=gb18030&word=%C3%A8&fr=ala&ala=1&alatpl=adress&pos=0&hs=2&xthttps=111111"
        kw = {"word":pic}
        response = requests.get(url,headers=headers,params=kw)
        websites = re.findall('"objURL":"(.*?)"',response.content.decode('utf8'),re.DOTALL)
        i = 0
        for website in websites:
            try:
                response_web = requests.get(website,headers=headers)
                if website[-3:]=='jpg':
                    with open("C:/Users/86135/Desktop/百度图片{}.jpg".format(i),'wb') as f:
                        f.write(response_web.content)
                elif website[-4:]=='jpeg':
                    with open("C:/Users/86135/Desktop/百度图片{}.jpeg".format(i),'wb') as f:
                        f.write(response_web.content)
                elif website[-3:]=='png':
                    with open("C:/Users/86135/Desktop/百度图片{}".format(i),'wb') as f:
                        f.write(response_web.content)
                elif website[-3:]=='bmp':
                    with open("C:/Users/86135/Desktop/百度图片{}".format(i),'wb') as f:
                        f.write(response_web.content)
                else:continue
            except:continue
            i+=1
    
    if __name__ == '__main__':
        pic = input("请输入您想要爬取的图片名称:")
        GetPictures(pic)
    

    运行结果如下:
    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • python爬虫爬取央视新闻,按特定关键词实现主题爬虫 文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习...

    python爬虫爬取百度上的图片,按特定关键词实现主题爬虫


    实现关键字爬取百度图片,并保存

    代码与分析

    自己做的任务,方便保存可以随时回来看作为一个笔记。

    python 爬虫的方法有很多种

    在这里插入图片描述在这里插入代码片

    # _*_ coding:utf-8 _*_
    # 工程作者:赖正良
    # 时间:2020/9/21/11:35
    from tkinter import *
    import requests
    import re
    import os
    from urllib import parse
    from urllib import request
    from urllib.request import urlretrieve
    from bs4 import BeautifulSoup
    import tkinter as tk
    # 定义一个gui界面显示
    # 显示图像框
    
    def main():
        running = 1
        global url_input,text,sshow
        # 创建空白窗口,作为主载体
        root = Tk()
        root.title('爬取数据')
        # 窗口的大小,后面的加号是窗口在整个屏幕的位置
        root.geometry('550x400+398+279')
        # 标签控件,窗口中放置文本组件
        Label(root,text='请输入关键词:',font=("华文行楷",20)).grid()
        # 定位 pack包 place位置 grid是网格式的布局
        url_input = Entry(root,font=("华文行楷",20))
        url_input.grid(row=0,column=1)
        # 输入
        #text = Listbox(root,font=('华文行楷',20),width=45,height=10)
        text = tk.Text(root, font=('华文行楷', 20), width=45, height=10)
        # columnspan 组件所跨越的列数
        text.grid(row=1,columnspan=2)
    # 爬虫函数,爬取关键字的内容
    # 定义一个爬虫函数
        def get_picture():
            word = url_input.get()
            url = ('https://image.baidu.com/search/acjson?'
                   'tn=resultjson_com&ipn=rj&ct=201326592&is=&fp=result&'
                   'queryWord={word}&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=&z=&ic=&'
                   'word={word}&s=&se=&tab=&width=&height=&face=&istype=&qc=&nc=&fr=&'
                   'pn={pn}&rn=30&gsm=5a&1516945650575=')
            pattern = '"thumbURL":"(.+?\.jpg)"'
            def geturls(num, word):
                word = parse.quote(word)
                urls = []
                pn = (num // 30 + 1) * 30
                for i in range(30, pn + 1, 30):
                    urls.append(url.format(word=word, pn=i))
                return urls
            def getimgs(num, urls):
                imgs = []
                reg = re.compile(pattern)
                for url in urls:
                    page = request.urlopen(url)
                    code = page.read()
                    code = code.decode('utf-8')
                    imgs.extend(reg.findall(code))
                    # print(code)
                return imgs
    # 获取url,设置存放图片的位置
            word = url_input.get()     # 输入关键字进行搜索
            num = 50                # 最多打印100张图片
            path = r'E:\南昌大学学习研究2020年5月\my_data'     # 图片存贮的路径
            # 判断图片保存路径是否存在,不存在就创建
            if not os.path.exists(path):
                os.mkdir(path)
                print('路径不存在,但已新建')
            # 进入百度图片搜索网页,搜索关键字,获取num整除30页图片搜索页面的地址列表
            urls = geturls(num, word)  # 百度搜索页面地址
            # 打开urls列表中的url,用正则表达式搜索以.jpg结尾的图片源地址url,保存到imgs列表中,imgs中的url是30的倍数
            imgs = getimgs(num, urls)  # 图片地址
    # 获取图片,保存图片
            i = 0  # 下载序号
            j = 0  # 请求超时数量
            for img in imgs:
                i += 1
                try:
                    request.urlretrieve(img, path + '/' + '%s.jpg' % (i - j))  # 将图片下载到指定目录
                except OSError as err:  # 下载超时处理
                    print('下载第%s图片时请求超时,已跳过该图片' % (i - j))
    
                else:
                    # stri =  print('成功下载第' + str(i - j) + '张图片')
                    sshow= '成功下载第' + str(i - j) + '张图片'
                    print(sshow)
                    text.insert(END,sshow+'\n')           # 在gui界面中动态显示下载的图片数量
                    text.see(END)                         # 更新每次打印
                    # 更新
                    text.update()
                    if (i - j) >= num:  # 判断是不是下载量达到指定数量
                        print('下载图片完毕,成功下载%d张照片,跳过%d张照片' % ((i - j), j))
                        break
    
    # 设置按钮 sticky对齐方式,N S W E
        button =Button(root,text='开始下载',font=("华文行楷",15),command=get_picture).grid(row=2,column=0,sticky=W)
        button =Button(root,text='退出',font=("华文行楷",15),command=root.quit).grid(row=2,column=1,sticky=E)
        if running == 1:
           root.mainloop()
    if __name__ == '__main__':
        main()
    
    

    在这里插入图片描述
    在这里插入图片描述

    总结笔记

    关键分析html码,记录下自己笔记

    展开全文
  • 前段时间学校安排的实训跟着学了几天,用python写的人脸颜值分析,结果会分出多个文件夹,每个文件夹里边的图片是相近颜值的。代码如下: from icrawler.builtin import BaiduImageCrawler # 爬虫 from aip import ...
  • 使用python3 urllib request re 等模块以及文件操作来实现爬取百度图片。包含三个文件,一个是代码,另外两个用来获取图片的数据,python代码在为indows和linux下都可以使用。直接可以运行,不过要注意下载到的图片...
  • 本文实例讲述了Python实现爬取百度贴吧帖子所有楼层图片爬虫。分享给大家供大家参考,具体如下: 下载百度贴吧帖子图片,好好看 python2.7版本: #coding=utf-8 import re import requests import urllib from ...
  • Python爬虫爬取百度NBA图片实战-Ajax动态抓包(小白入门必看) 对于刚入门爬虫的小白来说,对于动态加载网页很是头疼,动态加载是各大网站最基础的一种反扒手段,今天就以百度图片爬取为例,带大家感受一下动态爬虫...
  • python 爬虫爬取百度图片

    千次阅读 2017-10-04 11:05:52
    本人初学python爬虫,想试着爬取百度图片搜索上的图片。但简单的只是设置一下爬取的网页,然后用正则取筛选图片的链接,在京东或者当当的网页上可以,在百度上不好使。具体的代码如下:import re import urllib....
  • Python3爬虫抓取百度图片中的图片,可根据需求输入关键字、图片数量
  • python爬虫爬取百度贴吧图片,requests方法 知识点:反爬虫 1:仍然是找到该图片的http链接,复制到新窗口,找到user-agent 找到user-agent,将user-agent后边的内容全部复制 #反爬虫 headers = {'user-agent':'...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,993
精华内容 3,197
关键字:

python爬虫爬取百度图片

python 订阅
爬虫 订阅