python爬虫爬高清图片

本文代码来源csdn一位叫coso度的大佬

版权声明:本文为CSDN博主「COS0度」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/cos0du/article/details/116273972

前几天突然间就想着去学习爬虫,然后就看了看python,开始搞这个。然后开始百度,找到一位大佬发的东西,爬高清图片。但是大佬的代码弄到我这里,就会报错,就是爬完第二张图片就开始报错,下边是大佬的代码

import re
import requests
import os
from bs4 import BeautifulSoup

def getHtml(url):  #固定格式,获取html内容
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'
    }  #模拟用户操作
    try:
        r = requests.get(url, headers=headers)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        return r.text
    except:
        print('网络状态错误')

def getUrlList(url):  # 获取图片链接
    url_list = []  #存储每张图片的url,用于后续内容爬取
    demo = getHtml(url)
    soup = BeautifulSoup(demo,'html.parser')
    sp = soup.find_all('div', class_="list") #class='list'在全文唯一,因此作为锚,获取唯一的div标签;注意,这里的网页源代码是class,但是python为了和class(类)做区分,在最后面添加了_
    nls = re.findall(r'a href="(.*?)"', str(sp)) #用正则表达式提取链接
    for i in nls:
        if 'https' in i: #因所有无效链接中均含有'https'字符串,因此直接剔除无效链接(对应第3条的分析)
            continue
        url_list.append('http://www.netbian.com' + i) #在获取的链接中添加前缀,形成完整的有效链接
    return url_list

def fillPic(url,page):
    pic_url = getUrlList(url) #调用函数,获取当前页的所有图片详情页链接
    path = './美女'  # 保存路径
    for p in range(len(pic_url)):
        pic = getHtml(pic_url[p])
        soup = BeautifulSoup(pic, 'html.parser')
        psoup = soup.find('div', class_="pic") #class_="pic"作为锚,获取唯一div标签;注意,这里的网页源代码是class,但是python为了和class(类)做区分,在最后面添加了_
        picUrl = re.findall(r'src="(.*?)"', str(psoup))[0] #利用正则表达式获取详情图片链接,因为这里返回的是列表形式,所以取第一个元素(只有一个元素,就不用遍历的方式了)
        pic = requests.get(picUrl).content #打开图片链接,并以二进制形式返回(图片,声音,视频等要以二进制形式打开)
        image_name ='美女' + '第{}页'.format(page) + str(p+1) + '.jpg' #给图片预定名字
        image_path = path + '/' + image_name #定义图片保存的地址
        with open(image_path, 'wb') as f: #保存图片
            f.write(pic)
            print(image_name, '下载完毕!!!')

def main():
    n = input('请输入要爬取的页数:')
    url = 'http://www.netbian.com/meinv/'  # 资源的首页,可根据自己的需求查看不同分类,自定义改变目录,爬取相应资源
    if not os.path.exists('./美女'):  # 如果不存在,创建文件目录
        os.mkdir('./美女/')
    page = 1
    fillPic(url, page)  # 爬取第一页,因为第1页和后续页的链接的区别,单独处理第一页的爬取
    if int(n) >= 2: #爬取第2页之后的资源
        ls = list(range(2, 1 + int(n)))
        url = 'http://www.netbian.com/meinv/'
        for i in ls: #用遍历的方法对输入的需求爬取的页面做分别爬取处理
            page = str(i)
            url_page = 'http://www.netbian.com/meinv/'
            url_page += 'index_' + page + '.htm' #获取第2页后的每页的详情链接
            fillPic(url_page, page) #调用fillPic()函数

main()

代码确实很优秀,但是我搬过来之后爬取第二张之后就开始报错,然后就开始了自己找错之旅,吃别人现成的我还吃不好。

 

 

 下边是报错的内容,然后我就开始了百度之旅,然后实在是没找到啥,就开始去debug,

 

 

 我发现呢,他这个pic值是None,没获取到呗,然后往上边看,发现呢,pic_url多出来一个很奇怪的网址,就是02这个一块,他是两个网址拼接到一起了

 

 

然后自己就狗了一波,直接把这个移除了用了remove函数,在 def filePic(url,page):这个模块儿,我在第一句下边加了一个下边又加了一个pic_url.remove ='htp://netbian.comhttp://pic.netbian.com/'然后就可以正常使用了,其实事儿这里就差不多结束了,但是我还想知道为什么会出现这个,然后就分析:图片又是从上边来的,然后就往def getUrlList(url) 这个模块看我就把这一整块儿代码扒下来,跑一次,把他获取的网址打印出来看看呗

这是我扒下来的代码

import re
import requests
import os
from bs4 import BeautifulSoup
url ='http://www.netbian.com'
def getHtml(url):  #固定格式,获取html内容
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'
    }  #模拟用户操作
    try:
        r = requests.get(url, headers=headers)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        return r.text
    except:
        print('网络状态错误')

def main(url):  # 获取图片链接
    url_list = []  #存储每张图片的url,用于后续内容爬取
    demo = getHtml(url)
    soup = BeautifulSoup(demo,'html.parser')
    sp = soup.find_all('div', class_="list") #class='list'在全文唯一,因此作为锚,获取唯一的div标签;注意,这里的网页源代码是class,但是python为了和class(类)做区分,在最后面添加了_
    nls = re.findall(r'a href="(.*?)"', str(sp)) #用正则表达式提取链接
    for i in nls:
        if 'https' in i: #因所有无效链接中均含有'https'字符串,因此直接剔除无效链接(对应第3条的分析)
            continue
        if 'pic' in i:
            continue
        url_list.append('http://www.netbian.com' + i) #在获取的链接中添加前缀,形成完整的有效链接
    print (url_list)
main(url)

让他把获取的每一个网址都打印出来,果然没看错,下边是打印出来的东西,果然,错误的网址还在

 

 然后我就去看了看找图的那个网站,果不其然啊

 

 过滤标签的时候没考虑清楚,这也是网址一个,在获取本来是我想要的网址的时候,出来了一点问题,下边的语句跟他一拼接就出错了。

 

 事情至此圆满结束。然后我就在def getUrlList(url):这个模块儿下边的if 语句后又加了一个if

if 'pic' in i:

  continue

然后就没毛病了,大家如果对这个感兴趣的话,可以去参考大佬的文章,网址在我这边随笔开头,本文是一个我找错误的过程,虽然错误很小,但还是花了我很长时间,接下来打算去了解一下这几个库,我把自己修改的代码(其实就加了一句话,代码全是老哥的,希望大家把代码吃透)附在本文最后,给来学习的哥们儿参考,欢迎大家跟我一起探讨。爬虫的学习。

import re
import requests
import os
from bs4 import BeautifulSoup

def getHtml(url):  #固定格式,获取html内容
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'
    }  #模拟用户操作
    try:
        r = requests.get(url, headers=headers)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        return r.text
    except:
        print('网络状态错误')

def getUrlList(url):  # 获取图片链接
    url_list = []  #存储每张图片的url,用于后续内容爬取
    demo = getHtml(url)
    soup = BeautifulSoup(demo,'html.parser')
    sp = soup.find_all('div', class_="list") #class='list'在全文唯一,因此作为锚,获取唯一的div标签;注意,这里的网页源代码是class,但是python为了和class(类)做区分,在最后面添加了_
    nls = re.findall(r'a href="(.*?)"', str(sp)) #用正则表达式提取链接
    for i in nls:
        if 'https' in i: #因所有无效链接中均含有'https'字符串,因此直接剔除无效链接(对应第3条的分析)
            continue
        if 'pic' in i:
            continue
        url_list.append('http://www.netbian.com' + i) #在获取的链接中添加前缀,形成完整的有效链接
    return url_list
    print (url_list)

def fillPic(url,page):
    pic_url = getUrlList(url) #调用函数,获取当前页的所有图片详情页链接
    
    path = './美女'  # 保存路径
    for p in range(len(pic_url)):
        pic = getHtml(pic_url[p])
        soup = BeautifulSoup(pic, 'html.parser')
        psoup = soup.find('div', class_="pic")
        picUrl = re.findall(r'src="(.*?)"', str(psoup))[0] 
        pic = requests.get(picUrl).content 
        image_name ='美女' + '第{}页'.format(page) + str(p+1) + '.jpg' 
        image_path = path + '/' + image_name 
        with open(image_path, 'wb') as f: 
            f.write(pic)
            print(image_name, '下载完毕!!!')

def main():
    n = input('请输入要爬取的页数:')
    url = 'http://www.netbian.com/meinv/'  
    if not os.path.exists('./美女'):  
        os.mkdir('./美女/')
    page = 1
    fillPic(url, page)  
    if int(n) >= 2: 
        ls = list(range(2, 1 + int(n)))
        url = 'http://www.netbian.com/meinv/'
        for i in ls: 
            page = str(i)
            url_page = 'http://www.netbian.com/meinv/'
            url_page += 'index_' + page + '.htm' 
            fillPic(url_page, page) 

main()

 

posted @ 2021-10-20 20:08  张嘉禾  阅读(1081)  评论(0编辑  收藏  举报