python爬虫_批量爬取美女图片 - Go语言中文社区

python爬虫_批量爬取美女图片


学习python一月有余,写了一个爬虫练手,爬取 http://www.mzitu.com/xinggan/网站图片。关于python爬虫,网上和博客中教程较多,综合参考后写了本文。对以下博主表示感谢。

主要参考:https://blog.csdn.net/mockingbirds/article/details/72854243,文中讲的很详细了。本文在此基础上填了几个小坑。

环境:python 2.7

相关库:requests、bs4、urllib(scrapy库安装失败,懒的折腾了,没使用)

成果:


主要思路借鉴博客https://blog.csdn.net/mockingbirds/article/details/72854243

一、获取主页性感分类中每页的链接

二、获取当前页中主题的链接和主题名称

三、获取每个主题中的图片链接

四、逐个下载图片并按照主题名称分类保存

上文的博客讲的很详细了。这里就不详细讲了,本文代码在文章最后。主要经验教训:

一、上述第三步中,下载网页内容进行图片地址解析时,最好用requests库,不要用urlib。虽然大部分网页能正常解析,但是个别网页会显示乱码,这样地址解析时会报错。这是一个大坑,找了半天才发现

[python] view plain copy
  1. response = requests.get(titleurl)  
  2. response.encoding  = 'utf-8'  
  3. html = response.text  

二、上述第四步中,下载图片使用函数requests.get(image_url,headers=header),不要使用urllib.urlretrieve(image_url,file_name)。因为这个网站有一个简单的反爬虫方法,就是根据headers。使用后一个函数下载的图片是404错误图片。头的内容只需要referer和User-Agent即可。

[python] view plain copy
  1. img_response = requests.get(image_url, headers=header)  

三、采用网站中的主题名建立文件夹,将该主题下的图片都放入文件夹中。网站上的主题名有的含有冒号,建立文件夹的时候回报错,需要将冒号替换掉

[python] view plain copy
  1. base_dir=base_dir.replace(':','')#将其中的冒号替换掉,否则无法建立文件夹  

完整代码如下


#coding=utf-8
#爬取http://www.mzitu.com/xinggan/网站图片,遍历
import urllib
import requests
from bs4 import BeautifulSoup
import os

header={
'Referer': 'http://www.mzitu.com',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36',
}

class GetSexGirl(object):
    #获取所有页数的地址
    def get_all_urls(self):
        urls_list = []
        for i in range(1,82):
            url = "http://www.mzitu.com/xinggan/page/%s"%i
            urls_list.append(url)
        return urls_list
    #获取当前页中所有主题的地址和主题名称
    def get_title_urls(self,url):
        map_title_url = {}
        response = requests.get(url,header)
        html =response.text

        soup=BeautifulSoup(html)
        mytag=soup.select('#pins span a')
        size = len(mytag)
        for i in range(size):
            url=mytag[i].attrs['href']
            title=mytag[i].get_text()
            map_title_url[url] = title
            #print i,':  ',url,title
        return map_title_url
    # 获取当前主题下的所有图片url
    def get_image_urls(self,titleurl):
        response = requests.get(titleurl)
        response.encoding  = 'utf-8'
        html = response.text
        soup=BeautifulSoup(html)
        mytag=soup.select('.pagenavi span ')
        pagenum=int(mytag[6].get_text())#得到当前主题中的图片总页数
        mytag=soup.select('.main-image img ')[0]
        url1= mytag.attrs['src']
        #http://i.meizitu.net/2018/04/21c01.jpg
        url0= url1[0:32]
        imag_url_list = []
        for i in range(1,pagenum+1):
            url=url0+'%02d.jpg' % i
            imag_url_list.append(url)
            print i,url
        return  imag_url_list         #通过循环得到当前主题中的所有图片地址

     # 下载给定url的图片到本地
    def download_image(self, base_dir, image_url):
        #print('basedir is :'+base_dir+'  image_url is :'+image_url)
        image_name = image_url[-9:-4]
        # 获取图片的名称, image_url = http://i.meizitu.net/2017/04/24b01.jpg 这种格式
        #要保存到的目标文件名=文件目录+图片编号+后缀名
        file_name = base_dir+"%s.jpg"%image_name
        print  'file_name is :%s'%file_name, 'image_url is :%s'%image_url
       # urllib.urlretrieve(image_url,file_name)
        try:
            img_response = requests.get(image_url, headers=header)
        except:
            return
        if img_response.status_code!=404:
            f = open(file_name, 'wb')
            f.write(img_response.content)  # 多媒体文件要是用conctent
            f.close()
        return


if __name__ == '__main__':
    get_sex_girl = GetSexGirl()
    mian_page_urls_list=get_sex_girl.get_all_urls()#获取所有页的地址
    mian_page_num=len(mian_page_urls_list)
    for i in range(0,mian_page_num-1):
        print 'page',i+1
        mian_page_urls=mian_page_urls_list[i]##获取当前页的地址
        map_title_url=get_sex_girl.get_title_urls(mian_page_urls)
        title_urls_list=map_title_url.keys()##获取当前页的所有主题地址
        title_num=len(title_urls_list)
        for k in range(0,title_num-1):
            title_url=title_urls_list[k]#当前的主题地址
            title_name=map_title_url[title_url]#获取当前主题名称
            print '主题:',title_name
            imag_url_list=get_sex_girl.get_image_urls(title_urls_list[k])#获取所有图片地址
            imag_num=len(imag_url_list)
            title_name=title_name.replace(':','')#将其中的冒号替换掉,否则无法建立文件夹
            base_dir = os.path.abspath('.')+r'%s%s'%(i+1,title_name)
            if os.path.exists(base_dir) == False:
                print  ' 该主题文件夹不存在, 创建:', base_dir
                # 创建文件夹存放图片
                os.makedirs(base_dir)

            for m in range(0,imag_num-1):
                image_url=imag_url_list[m]
                get_sex_girl.download_image(base_dir, image_url)






版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_16631573/article/details/80186391
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-03-01 22:39:03
  • 阅读 ( 1271 )
  • 分类:

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢