精华内容
下载资源
问答
  • python爬虫爬取图片

    千次阅读 多人点赞 2020-12-27 15:46:49
    可以看到,我们想爬取图片明显不在这个界面,那我们顺便点进去一个: 进去后是这样的,右键检查图片也可以发现我们需要的图片链接都是在这个界面的,那么到这里基本上久分析完成了,可以进行下一步了。 2.敲代码 ...

    动态爬虫传送门,咻咻咻!!!

    天堂图片网为例。

    1.分析网站

    进入网站后的页面如下:
    在这里插入图片描述
    可以看到,我们想爬取的图片明显不在这个界面,那我们顺便点进去一个:
    在这里插入图片描述

    进去后是这样的,右键检查图片也可以发现我们需要的图片链接都是在这个界面的,那么到这里基本上就分析完成了,可以进行下一步了。

    2.敲代码

    养成好习惯,先把网站的headers获取一下(有些网站的访问并不需要headers):
    在这里插入图片描述

    headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36'}
    

    通过以上分析,也就是说我们要先访问初始网页,然后在初始界面里定位到目标网页的url,然后访问目标网页,并在目标网页里定位到具体的图片链接,然后将图片下载下来久好了。
    接下来,是具体代码实现:
    1.访问初始网页:

    url_base='https://www.ivsky.com/tupian/ziranfengguang/'
    response=requests.get(url,headers=headers)#访问网页
    html=response.text
    

    2.定位目标网页(这里我主要用的方法是正则表达式,当然也有很多其他的方法,看个人):

    urls=re.findall('<p><a href="(.*?)" title=".*?" target="_blank">.*?</a></p>',html)#获取链接
    for url in urls:#遍历链接
    	print(url)
    

    3.访问目标网页
    注意:以上步骤获得的url输出后是这样的
    在这里插入图片描述
    这样的url是不能直接用requests.get方法去访问的,也就是说,需要我们进行一些加工(可以直接手动点进去看一下网页的具体url):

    url="https://www.ivsky.com/"+url#规范格式
    response=requests.get(url,headers=headers)
    html1=response.text
    

    4.定位图片链接,并下载保存
    我想将一个网页下的图片保存到一个文件夹,所有先创建一个文件夹,直接用它网页的标题做文件名(因为我个人比较懒,不想自己想名字):

    dir_name=re.findall('<h1>(.*?)</h1>',html1)#以标题为文件夹名
    if not os.path.exists(str(dir_name)):#判断文件夹有无,没有则生成
    		os.mkdir(str(dir_name))
    

    然后定位图片,下载:
    注意:这里的图片链接有跟上面一样的问题

    pics=re.findall('<div class="il_img"><a href=".*?" title=".*?" target="_blank"><img src="(.*?)" alt=".*?"></a>',html1)#获取图片
    for pic in pics:#遍历图片
    		file_name=pic.split('/')[-1]#以/为分隔符,取最后一段作为文件名
    		pic="http:"+pic#规范格式
    		response=requests.get(pic,headers=headers)
    		with open(str(dir_name) + '/' + file_name,'wb') as f:#/为分级 wb代表二进制模式文件,允许写入文件,
    		f.write(response.content)
    

    完整代码:

    url_base='https://www.ivsky.com/tupian/ziranfengguang/'
    response=requests.get(url,headers=headers)#访问网页
    html=response.text
    urls=re.findall('<p><a href="(.*?)" title=".*?" target="_blank">.*?</a></p>',html)#获取链接
    for url in urls:#遍历链接
    	url="https://www.ivsky.com/"+url#规范格式
    	response=requests.get(url,headers=headers)
    	html1=response.text
    	dir_name=re.findall('<h1>(.*?)</h1>',html1)#以标题为文件夹名
    	if not os.path.exists(str(dir_name)):#判断文件夹有无,没有则生成
    		os.mkdir(str(dir_name))
    	pics=re.findall('<div class="il_img"><a href=".*?" title=".*?" target="_blank"><img src="(.*?)" alt=".*?"></a>',html1)#获取图片
    	for pic in pics:#遍历图片
    		file_name=pic.split('/')[-1]#以/为分隔符,取最后一段作为文件名
    		pic="http:"+pic#规范格式
    		response=requests.get(pic,headers=headers)
    		with open(str(dir_name) + '/' + file_name,'wb') as f:#/为分级 wb代表二进制模式文件,允许写入文件,
    		f.write(response.content)
    

    到这里,爬取图片的功能已经基本实现,但是(画重点了嗷!!!)

    3.代码完善和纠错

    很明显的啦!每个图片网站的图片怎么可能只有一页
    在这里插入图片描述
    也就是说我们还需要加一个翻页的操作,因为天堂图片网是个静态网页,通过观察他的不同页的网址变化,其实不难找出规律:
    这是第一页
    这是第一页
    在这里插入图片描述
    这是第二页,一目了然嘛。
    那具体代码实现:

    url_base='https://www.ivsky.com/tupian/ziranfengguang/'
    for x in range(1):#定义爬取到的图片页
    	if x==1:
    		pass
    	else:
    		url=url_base+"index_"+str(x)+".html"
    

    到这里,相信已经有细心的小伙伴发现了,那如果图片页里面也有好几页该这么办呢,不可能也像上面的一样,搞格式匹配吧,毕竟不是每个图片页都有好几页的。
    在这里插入图片描述
    也就是说,我们在访问每一个图片页后,需先对是否有下一页进行一个判断,然后来决定接下来的执行过程,这里就又要用到正则表达式定位了。
    具体代码实现:

    next_page=re.findall("<a class='page-next' href='(.*?)'>下一页</a>",html1)
    if next_page:#如果有下一页
    	for url in next_page:#因为直接得到的next_page是list型的,通过这个方式转换为str型
    		url="https://www.ivsky.com/"+url 
    		response=requests.get(url,headers=headers)
    		html=response.text
    		``````
    

    那么到这里,我们对天堂图片网的图片的爬虫才真正的已经基本上完成了,下面附上:

    真—完整代码

    import requests
    import re
    import os
    import time
    
    headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36'}
    
    def get_pics(url):#获取图片函数
    	response=requests.get(url,headers=headers)#访问网页
    	html=response.text
    	urls=re.findall('<p><a href="(.*?)" title=".*?" target="_blank">.*?</a></p>',html)#获取链接
    	for url in urls:#遍历链接
    		time.sleep(1)
    		url="https://www.ivsky.com/"+url#规范格式
    		response=requests.get(url,headers=headers)
    		html1=response.text
    		dir_name=re.findall('<h1>(.*?)</h1>',html1)#以标题为文件夹名
    		if not os.path.exists(str(dir_name)):#判断文件夹有无,没有则生成
    			os.mkdir(str(dir_name))
    		down_pics(html1,dir_name)
    
    def down_pics(html1,dir_name):
    		pics=re.findall('<div class="il_img"><a href=".*?" title=".*?" target="_blank"><img src="(.*?)" alt=".*?"></a>',html1)#获取图片
    		for pic in pics:#遍历图片
    			file_name=pic.split('/')[-1]#以/为分隔符,取最后一段作为文件名
    			pic="http:"+pic#规范格式
    			response=requests.get(pic,headers=headers)
    			with open(str(dir_name) + '/' + file_name,'wb') as f:#/为分级 wb代表二进制模式文件,允许写入文件,
    				f.write(response.content)
    		next_page=re.findall("<a class='page-next' href='(.*?)'>下一页</a>",html1)
    		if next_page:#如果有下一页
    			for url in next_page:
    				url="https://www.ivsky.com/"+url 
    				response=requests.get(url,headers=headers)
    				html=response.text
    				down_pics(html,dir_name)
    
    if __name__ == "__main__":
    	url_base='https://www.ivsky.com/tupian/ziranfengguang/'
    	for x in range(1):#定义爬取到的图片页
    		if x==1:
    			pass
    		else:
    			url=url_base+"index_"+str(x)+".html"
    			get_pics(url)
    
    

    以上方法应该可以用于大部分静态网页,如果你不能爬取图片,先考虑你的定位表达式有没有问题。如果是可以下载但无法打开,就要考虑你的headers是否写错,或者是网页设置了防盗链。
    另外,特别提出,写正则表达式一定要根据网页源代码写,不要根据F12里面的写
    写正则表达式一定要根据网页源代码写
    写正则表达式一定要根据网页源代码写
    写正则表达式一定要根据网页源代码写
    重要的事情说三遍!!!
    (如果你一定要问我为什么,可以自己去看看上面关于next_page的F12和网页源代码的区别)

    写的不怎么样,大家见谅哈!!
    动态爬取图片方法已经跟新了,传送门,咻咻咻!!!

    展开全文
  • Python爬虫爬取图片.zip

    2020-05-07 10:19:41
    资源内容是利用Python爬虫技术,自动爬取和批量下载百度图片,资源内附完整的爬虫代码,并且转成了exe应用程序
  • 1)建立一个爬取图片的自定义函数,该函数负责爬取一个页面下我们想要爬取的图片,爬取过程为:首先通过urli request uloen(ur),reado读取对应网页的全部源代码,然后根据上面的第一个正则表达式进行第一次
  • 网络爬虫可以代替手工做很多事情,比如可以用于做搜索引擎,也可以爬取网站上面的图片,比如有些朋友将某些网站上的图片全部爬取下来,集中进行浏览,同时,网络爬虫也可以用于金融投资领域,比如可以自动爬取一些...
  • 最近几天,研究了一下一直很好奇的爬虫算法。这里写一下最近几天的点点心得。下面进入正文:你可能需要的工作环境:我们这里以sogou作为爬取的对象。首先我们进入搜狗图片http://pic.sogou.com/,进入壁纸分类(当然...

    最近几天,研究了一下一直很好奇的爬虫算法。这里写一下最近几天的点点心得。下面进入正文:

    你可能需要的工作环境:

    我们这里以sogou作为爬取的对象。

    首先我们进入搜狗图片http://pic.sogou.com/,进入壁纸分类(当然只是个例子Q_Q),因为如果需要爬取某网站资料,那么就要初步的了解它…

    948344-20170316101854791-1865658722.png

    进去后就是这个啦,然后F12进入开发人员选项,笔者用的是Chrome。

    右键图片>>检查

    948344-20170316102433979-2004628955.png

    发现我们需要的图片src是在img标签下的,于是先试着用 Python 的 requests提取该组件,进而获取img的src然后使用 urllib.request.urlretrieve逐个下载图片,从而达到批量获取资料的目的,思路好了,下面应该告诉程序要爬取的url为http://pic.sogou.com/pics/recommend?category=%B1%DA%D6%BD,此url来自进入分类后的地址栏。明白了url地址我们来开始愉快的代码时间吧:

    在写这段爬虫程序的时候,最好要逐步调试,确保我们的每一步操作正确,这也是程序猿应该有的好习惯。笔者不知道自己算不算个程序猿哈。线面我们来剖析该url指向的网页。

    importrequestsimporturllibfrom bs4 importBeautifulSoup

    res= requests.get('http://pic.sogou.com/pics/recommend?category=%B1%DA%D6%BD')

    soup= BeautifulSoup(res.text,'html.parser')print(soup.select('img'))

    output:

    948344-20170316105046088-1059001393.png

    发现输出内容并不包含我们要的图片元素,而是只剖析到logo的img,这显然不是我们想要的。也就是说需要的图片资料不在url 即 http://pic.sogou.com/pics/recommend?category=%B1%DA%D6%BD里面。因此考虑可能该元素是动态的,细心的同学可能会发现,当在网页内,向下滑动鼠标滚轮,图片是动态刷新出来的,也就是说,该网页并不是一次加载出全部资源,而是动态加载资源。这也避免了因为网页过于臃肿,而影响加载速度。下面痛苦的探索开始了,我们是要找到所有图片的真正的url 笔者也是刚刚接触,找这个不是太有经验。最后找的位置F12>>Network>>XHR>>(点击XHR下的文件)>>Preview。

    948344-20170316110737885-1801555564.png

    发现,有点接近我们需要的元素了,点开all_items 发现下面是0 1 2 3...一个一个的貌似是图片元素。试着打开一个url。发现真的是图片的地址。找到目标之后。点击XHR下的Headers

    得到第二行

    Request URL:

    http://pic.sogou.com/pics/channel/getAllRecomPicByTag.jsp?category=%E5%A3%81%E7%BA%B8&tag=%E5%85%A8%E9%83%A8&start=0&len=15&width=1536&height=864,试着去掉一些不必要的部分,技巧就是,删掉可能的部分之后,访问不受影响。经笔者筛选。最后得到的url:http://pic.sogou.com/pics/channel/getAllRecomPicByTag.jsp?category=%E5%A3%81%E7%BA%B8&tag=%E5%85%A8%E9%83%A8&start=0&len=15 字面意思,知道category后面可能为分类。start为开始下标,len为长度,也即图片的数量。好了,开始愉快的代码时间吧:

    开发环境为Win7 Python 3.6,运行的时候Python需要安装requests,

    Python3.6 安装requests 应该CMD敲入:

    pip install requests

    笔者在这里也是边调试边写,这里把最终的代码贴出来:

    importrequestsimportjsonimporturllibdefgetSogouImag(category,length,path):

    n=length

    cate=category

    imgs= requests.get('http://pic.sogou.com/pics/channel/getAllRecomPicByTag.jsp?category='+cate+'&tag=%E5%85%A8%E9%83%A8&start=0&len='+str(n))

    jd=json.loads(imgs.text)

    jd= jd['all_items']

    imgs_url=[]for j injd:

    imgs_url.append(j['bthumbUrl'])

    m=0for img_url inimgs_url:print('*****'+str(m)+'.jpg *****'+'Downloading...')

    urllib.request.urlretrieve(img_url,path+str(m)+'.jpg')

    m= m + 1

    print('Download complete!')

    getSogouImag('壁纸',2000,'d:/download/壁纸/')

    程序跑起来的时候,笔者还是有点小激动的。来,感受一下:

    948344-20170316112307713-756166568.png

    948344-20170316130344245-333279268.png

    至此,关于该爬虫程序的编程过程叙述完毕。整体来看,找到需要爬取元素所在url,是爬虫诸多环节中的关键

    948344-20170401134832180-1717477357.png

    展开全文
  • 今天小编就为大家分享一篇Python爬虫爬取图片写入world文档的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • 2. 分析获取到的网页信息,提取需要的信息(图片地址) 3. 使用request将图片保存到本地以及会碰到的一些问题 1)获取图片信息,再保存到本地文件中 2). 超时处理 3). 读写超时 4). 超时重试 4.使用urllib 将...

    目录

    1. 如何获取网页信息

    1). 直接从网络读取

    2). 先将网页源码保存到本地,再读取

    2. 分析获取到的网页信息,提取需要的信息(图片地址)

    3. 使用request将图片保存到本地以及会碰到的一些问题

    1)获取图片信息,再保存到本地文件中

    2). 超时处理

    3). 读写超时

    4). 超时重试

    4. 使用urllib 将图片保存到本地以及会碰到的一些问题

    1). 使用 urllib 

    2). 超时处理

    2). 再次下载

    3). 显示下载进度

    5. urllib和requests设置超时后添加headers的问题

     1). requests设置

    2). urllib设置

    6. 总结


    本人略微学了一点python,主要是java。最近因为个人原因,需要爬虫抓取图片,近期面向百度编程,顺路总结一下。

    写爬虫,首先需要获取网页信息,然后从网页的一堆标签中找到有图片信息(地址)的,然后再利用网址把图片保存起来。

     

    1. 如何获取网页信息

    1). 直接从网络读取

    from bs4 import BeautifulSoup
    
    url = "http://www.baidu.com" 
    headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36'
    }
    
    # url 是网页地址
    web_data = requests.get(url, headers=headers)    
    soup = BeautifulSoup(web_data.text, 'lxml')  
    
    
    

    读取的方法就是 

    web_data = requests.get(url, headers=headers)    
    soup = BeautifulSoup(web_data.text, 'lxml') 

    2). 先将网页源码保存到本地,再读取

    from bs4 import BeautifulSoup
    
    file = open('C:/Users/tj/Desktop/test.html','r',encoding='utf-8')
    soup = BeautifulSoup(file,'lxml')

    2. 分析获取到的网页信息,提取需要的信息(图片地址)

    这里假设所有的图片都在img标签中,所有的img标签都在一个class属性名为beautiful的div(有且只有这么一个)中,图片的地址信息都在img的src属性中。

    from bs4 import BeautifulSoup
    import requests
    
    
    # soup 有N多方法,find()、find_all()等 (具体用法百度), 
    
    img_list=soup.find('div', class_="beautiful").find_all('img')
    
    # 对 img_list进行遍历,获取其中的信息保存到数组中
    li=[]
    for x in range(len(img_list)):
        print(x+1,":      ",img_list[x].attrs["src"])   
        li.append(img_list[x].attrs["src"])

    3. 使用request将图片保存到本地以及会碰到的一些问题

    1)获取图片信息,再保存到本地文件中

    """
    描述
    enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。
    
    Python 2.3. 以上版本可用,2.6 添加 start 参数。
    
    语法
    以下是 enumerate() 方法的语法:
    enumerate(sequence, [start=0])
    
    参数
    sequence -- 一个序列、迭代器或其他支持迭代对象。
    start -- 下标起始位置。
    """
    from bs4 import BeautifulSoup
    import requests
    
    path="C:/Users/tj/Desktop/"
    
    # i表示下标(从1开始), v表示数组的内容
    for i,v in enumerate(li,start=1): 
        # 将 图片地址(即v) 再次放入request中
        image = requests.get(v, timeout=10) 
        """ 
            存取图片过程中,出现不能存储int类型,故而,我们对他进行类型转换str()。
            w:读写方式打开,b:二进制进行读写。图片一般用到的都是二进制。
        """
        with open( path + str(i)+'.jpg', 'wb') as file:
            # content:图片转换成二进制,进行保存。
            file.write(image.content)
    
      
        # 也可以使用如下方式保存到本地(和上面的保存到本地的方式其实一样)
        dir = path + str(i)+'.jpg'
        fp = open(dir, 'wb')
        fp.write(image.content)
        fp.close()

    2). 超时处理

    有些图片可能网址打不开,所以要添加超时处理:

    from bs4 import BeautifulSoup
    import requests
    
    path="C:/Users/tj/Desktop/"
    
    # i表示下标(从1开始), v表示数组的内容
    for i,v in enumerate(li,start=1): 
    
        try:
            # 将 图片地址(即v) 再次放入request中
            image = requests.get(v, timeout=10) 
        except requests.exceptions.ConnectionError:
            print('【错误】当前图片无法下载')
            continue
    
        with open( path + str(i)+'.jpg', 'wb') as file:
            # content:图片转换成二进制,进行保存。
            file.write(image.content) 

        网络请求不可避免会遇上请求超时的情况,在 requests 中,如果不设置你的程序可能会永远失去响应。
        超时又可分为连接超时和读取超时。

        连接超时指的是在你的客户端实现到远端机器端口的连接时(对应的是connect()),Request 等待的秒数。就算不设置,也会有一个默认的连接超时时间(据说是21秒)。

    3). 读写超时

        读取超时指的就是客户端等待服务器发送请求的时间。(特定地,它指的是客户端要等待服务器发送字节之间的时间。在 99.9% 的情况下这指的是服务器发送第一个字节之前的时间)。

        简单的说,连接超时就是发起请求连接到连接建立之间的最大时长,读取超时就是连接成功开始到服务器返回响应之间等待的最大时长。

        如果你设置了一个单一的值作为 timeout,如下所示:

    r = requests.get('https://github.com', timeout=5)
    

    这一 timeout 值将会用作 connect 和 read 二者的 timeout。如果要分别制定,就传入一个元组: 

    r = requests.get('https://github.com', timeout=(3.05, 27))
    

    读取超时是没有默认值的,如果不设置,程序将一直处于等待状态。我们的爬虫经常卡死又没有任何的报错信息,原因就在这里了。

    4). 超时重试

    一般超时我们不会立即返回,而会设置一个三次重连的机制。

    def gethtml(url):
        i = 0
        while i < 3:
            try:
                html = requests.get(url, timeout=5).text
                return html
            except requests.exceptions.RequestException:
                i += 1
    

    其实 requests 已经帮我们封装好了。(但是代码好像变多了...)

    import time
    import requests
    from requests.adapters import HTTPAdapter
    
    s = requests.Session()
    s.mount('http://', HTTPAdapter(max_retries=3))
    s.mount('https://', HTTPAdapter(max_retries=3))
    
    print(time.strftime('%Y-%m-%d %H:%M:%S'))
    try:
        r = s.get('http://www.google.com.hk', timeout=5)
        return r.text
    except requests.exceptions.RequestException as e:
        print(e)
    print(time.strftime('%Y-%m-%d %H:%M:%S'))
    

    max_retries 为最大重试次数,重试3次,加上最初的一次请求,一共是4次,所以上述代码运行耗时是20秒而不是15秒

    注意: 从 超时重试 直到这里, 参考了 https://www.cnblogs.com/gl1573/p/10129382.html在此表示感谢。

    4. 使用urllib 将图片保存到本地以及会碰到的一些问题

    1). 使用 urllib 

    urllib2 在 python3.x 中被改为urllib.request 

    import urllib  
    
    #i表示下标,从1开始; v表示数组的值(图片的地址)
    for i,v in enumerate(li,start=1):   
    	urllib.request.urlretrieve(v, path+str(x)+'.jpg')   

    2). 超时处理

    有些图片可能网址打不开,所以要添加超时处理,但超时处理如下设置:

    import urllib  
    import socket 
    
    #设置超时时间为30s
    socket.setdefaulttimeout(30)
    
    #i表示下标,从1开始; v表示数组的值(图片的地址)
    for i,v in enumerate(li,start=1):   
    	urllib.request.urlretrieve(v, path+str(x)+'.jpg')   

    2). 再次下载

    同时,还可以超时后 使用递归 再次下载:

    tips:新下载的文件会覆盖原来下载不完全的文件。

    import urllib  
    import socket 
    
    #设置超时时间为30s
    socket.setdefaulttimeout(30)
    
    def auto_down(url,filename):
        try:
            urllib.urlretrieve(url,filename)
        except urllib.ContentTooShortError:
            print 'Network conditions is not good.Reloading.'
            auto_down(url,filename)
    
    #i表示下标,从1开始; v表示数组的值(图片的地址)
    for i,v in enumerate(li,start=1):   
        auto_down(v, path+str(x)+'.jpg') 
    
    
    

    但下载 会尝试好几次,甚至十几次,偶尔会陷入死循环,这种情况是非常不理想的。需要避免陷入死循环,提高运行效率。

    import urllib  
    import socket 
    
    #设置超时时间为30s
    socket.setdefaulttimeout(30)
    
    #i表示下标,从1开始; v表示数组的值(图片的地址)
    for i,url in enumerate(li,start=1):   
    	urllib.request.urlretrieve(v, path+str(x)+'.jpg')   
    
    try:
        urllib.request.urlretrieve(url,path+str(x)+'.jpg')
    except socket.timeout:
        count = 1
        while count <= 5:
            try:
                urllib.request.urlretrieve(url,path+str(x)+'.jpg')                                                
                break
            except socket.timeout:
                err_info = 'Reloading for %d time'%count if count == 1 else 'Reloading for %d times'%count
                print(err_info)
                count += 1
        if count > 5:
            print("downloading picture fialed!")

    注意: 从 使用递归再次下载直到这里, 参考了 https://www.jianshu.com/p/a31745fef1d8 , 在此表示感谢。

    3). 显示下载进度

    同时使用 urllib.request.urlertriever() 的其他参数还可以显示出下载进度

    import urllib
    from urllib.request import urlretrieve
    
    #解决urlretrieve下载文件不完全的问题且避免下载时长过长陷入死循环
    def auto_down(url,filename):
        try:
            urlretrieve(url,filename,jindu)
        except socket.timeout:
            count = 1
            while count <= 15:
                try:
                    urlretrieve(url, filename,jindu)
                    break
                except socket.timeout:
                    err_info = 'Reloading for %d time' % count if count == 1 else 'Reloading for %d times' % count
                    print(err_info)
                    count += 1
            if count > 15:
                print("下载失败")
    
    """ 
    urlretrieve()的回调函数,显示当前的下载进度
        a为已经下载的数据块
        b为数据块大小
        c为远程文件的大小
    """
    
    global myper
    def jindu(a,b,c):
        if not a:
            print("连接打开")
        if c<0:
            print("要下载的文件大小为0")
        else:
            global myper
            per=100*a*b/c
     
            if per>100:
               per=100
            myper=per
            print("当前下载进度为:" + '%.2f%%' % per)
        if per==100:
                return True 

    注意: 上面这段参考: https://blog.csdn.net/HW140701/article/details/78254826 在此表示感谢。

    5. urllib和requests设置超时后添加headers的问题

     1). requests设置

        request设置超时是用 requests.session() 返回的对象设置的,添加headers如下设置:

        本人未亲自验证,不知道对错。

    import requests
    
    
    cookies.clear
    headers = { 
        "User-Agent" : "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.1.6) ", 
    }
    
    conn = requests.session()#设置一个回话
    resp = conn.post('https://www.baidu.com/s?wd=findspace',headers=headers)
    
    # 打印请求的头
    print(resp.request.headers)
    print resp.cookies
    
    # 再访问一次:
    resp = conn.get('https://www.baidu.com/s?wd=findspace',headers=headers)
    print(resp.request.headers)
    print resp.cookies
    

    2). urllib设置

        urllib如下设置:

        本人未亲自验证,不知道对错。

        注意:这个headers是不是字典。

    opener = urllib.request.build_opener()
    
    opener.addheaders = 
    [
    ('User-agent', 
    'Opera/9.80 (Android 2.3.4; Linux; Opera Mobi/build-1107180945; U; en-GB) Presto/2.8.149 Version/11.10')
    ]
    
    urllib.request.install_opener(opener)
    urllib.request.urlretrieve(URL, path)   #path为本地保存路径
     

    6. 总结

        其实还是挺简单的(因为我没碰到难的。。。),最难的就是分析网页结构,都是套路。

    展开全文
  • python爬虫爬取图片保存到本地文件

    千次阅读 2019-02-16 20:46:00
    今天搜索电脑壁纸突发奇想就把所有壁纸怕取下来了 百度 壁纸 随便挑了一个点进去是zol电脑壁纸ZOL桌面壁纸 现在开始爬取 import requests ...def baocun(url):#此方法是将图片保存文件到本地 只需要传入图片...

    今天搜索电脑壁纸突发奇想就把所有壁纸怕取下来了

    百度 壁纸 随便挑了一个点进去是zol电脑壁纸ZOL桌面壁纸

    现在开始爬取

    import requests
    from lxml import etree
    import time
    import os
    #url = 'http://desk.zol.com.cn/nb/'
    def baocun(url):#此方法是将图片保存文件到本地 只需要传入图片地址
    	root = "E://python//"#这是根文件所在
    	path=root+url.split('/')[-1]#通过’/‘把图片的url分开找到最后的那个就是带.jpg的保存起来
    
    	if not os.path.exists(root):
    		os.mkdir(root)
    	if not os.path.exists(path):
    		r = requests.get(url)
    		r.raise_for_status()
    		with open(path,'wb') as f:#模式以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等
    			f.write(r.content)#r.content返回二进制,像图片
    			print('爬取成功')
    def getHTML(url):#解析网页 并且解析出来图片地址
    	response = requests.get(url)
    	response.encoding='gbk'#先前解析出来的是乱码 看网页得知编码方式是gbk
    	html = etree.HTML(response.text)#etree.HTML()#是一个方法用来解析html网页的
    	imgurl=html.xpath('//div[@class="wrapper top-main clearfix"]/div[1]/ul[1]/li/a/img/@src')#通过f12开发者工具查看网页代码得知图片地址具体所在
    	count=1
    	for index,i in enumerate(imgurl):
    		# print("这是第"+str(count)+"数据")
    		print(i)
    		baocun(i)
    		count=count+1
    indexa=1
    for i in range(1,100):#做到翻页,先观察这个网址的每一页的规律再进行翻页,因为每一个的网页的xpath都是固定的只需要顺序请求每一页再然后每一页再进行解析就能把全部的图片下载下来
    	url='http://desk.zol.com.cn/nb/%d.html'%i#占位符
    	print('这是第'+str(indexa)+"页数据")
    	indexa=indexa+1
    	getHTML(url)
    	time.sleep(2)#设置请求一页休眠2秒 避免被拦截
    
    • 这是全部代码我花了很长的时间是因为当我使用xpath解析网页的时候一步一步来的把每一个的div的class以及ul跟li的class都写出来可是就是返回的空。最后我在根的div元素开始使用div[index]这样的方式最终获取了图片路径,这里提醒大家如果xpath很仔细还不对可能是网页设计的坑,有一次爬取51job的时候又一个类是后面加了一个空格,不很仔细看看不出来,复制也复制不出来这个空格。最后直接copy的xpath。径才可以。有时候一种方式解析不出换一种方式可能就行了。要仔细。
    展开全文
  • 可以直接下载整站的图片 代码中使用多线程进行批量下载 代码中相关的内容已经加了注释 下载的同学应该可以自行修改里面的代码了
  • 主要介绍了Python爬虫爬取一个网页上的图片地址实例代码,具有一定借鉴价值,需要的朋友可以参考下
  • python爬虫爬取图片

    2019-10-17 16:28:57
    简单,易懂,容易上手,适合初学者。python版本使用的python3,BeautifulSoup 需要安装
  • (这个懒加载对用户和服务器都是比较友好的,但是对于我们爬虫来说就比较蛮烦了。往往用xpath或者bs4取解析数据的时候,就不准确。) 我们看看下面这张图片有个src2属性,我们知道img标签没有这个属性,只有src属性...
  • 本文是继前2篇Python爬虫系列文章的后续篇,给大家介绍的是如何使用Python爬取京东商品评论信息的方法,并根据数据绘制成各种统计图表,非常的细致,有需要的小伙伴可以参考下
  • 第一步:登录百度图片官网,截图如下所示: 注意点一:开头必须是https(如上图所示,出现锁的标志),不能是http,否则后期下载图片文件会出错 第二步:输入关键字,页面加载出来之后,按F12进入开发者模式,由于百度图片ajax...
  • #最好用的一个 ...# 百度图片URL解码 # http://blog.csdn.net/hbuxiaoshe/article/details/44780653 str_table = { '_z2C$q': ':', '_z&e3B': '.', 'AzdH3F': '/' } char_table = { 'w': 'a', 'k': 'b',
  • 分析 爬取地址:https://www.58pic.com/piccate/10-0-0-p1.html ...具体图片在class="show-area-pic"里 数据库创建 import pymysql db = pymysql.connect('localhost','root','','_pro') curs...
  • 本文主要介绍了Python爬虫:通过关键字爬取百度图片的方法。具有很好的参考价值,下面跟着小编一起来看下吧
  • 爬取百度图片,并存入本地文件中。 例: 爬取的是怪兽大学百度图片,并存入本地(嘿嘿安利大家,非常励志的一部电影,看了三次) 首先我们找到图片的链接,并将json格式解析, 代码如下: import requests import json...
  • python爬虫 爬取图片并保存

    千次阅读 2018-09-19 11:16:44
    今天爬了美丽说网站首页的图片 可是等把图片的url获取之后却不知道怎么保存了。。(感觉自己当时脑子短路了) 然后自己上网查看了一些方法。。 1.网上有说 urllib模块中有个urlretrieve函数可以直接下载保存,于是...
  • 使用Python的requests库访问网页,使用BeautifulSoup4进行解析,找到图片链接,用pillow转换图片格式,tkinter用来显示爬取图片
  • python爬虫爬取图片并保存到本地

    万次阅读 2018-08-29 20:04:00
    这里对于怎么爬取一个网页图片的链接不作介绍,当我们获取到图片的链接(假设为url)时,存到本地有两种方式: 1、以二进制方式写入文件即可 f = open(r"E:\Picture\0.png",'wb')#注意写入方式 f.write...
  • 前段时间学校安排的实训跟着学了几天,用python写的人脸颜值分析,结果会分出多个文件夹,每个文件夹里边的图片是相近颜值的。代码如下: from icrawler.builtin import BaiduImageCrawler # 爬虫 from aip import ...
  • 这篇文章主要介绍了Python爬虫爬取煎蛋网图片代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 今天,试着爬取了煎蛋网的图片。 用到的包: urllib....
  • Python爬虫 爬取网站全部图片实战

    千次阅读 2020-10-13 09:58:20
    获得图片地址 和 图片名称 1.进入网址之后 按F12 打开开发人员工具点击elemnts 2.点击下图的小箭头 选择主图中的任意一个图片 那我们这里点击第一个 图片 3.显示控制台 为了验证xpath是否正确 4.通过...
  • 我们要爬取的页面是榜单。 第一步 打开F12,分析请求网址。 在XHR中可以很快找到网站用来存放图片信息的接口网址。 我们可以很直接的看出这个接口为post请求,并且有一段需要拼接的FormData内容。 这里博主还发现...
  • python爬虫:爬取动态生成的DOM节点渲染数据结果,该方式不是直接拿到接口进行解析,而是XHR中看不到数据,检查网页又能看到,普通爬虫爬取下来的结果是看不到爬取到的这个数据所在的div的。
  • 爬取美图录网页图片爬取美图录网页图片爬取美图录网页图片爬取美图录网页图片爬取美图录网页图片爬虫神器!

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 31,083
精华内容 12,433
关键字:

python爬虫爬取图片

python 订阅
爬虫 订阅