python爬虫简易到进阶实战篇——(4)

python简易实战(4)——明星写真图片爬取

这一章将继承上一章对网页图片的获取
将对实例进行操作

操作之前,我们先要找到自己想要获取内容的网页,我在网上看到了一些爬取妹子图的,本着纯洁教学的心理,我并没有爬取这个,而是选择了某个明星写真网站,网址http://www.mingxing.com/tuku/index?&p=1,然后对其分析。
首先,我们需要通过原网页获取一些子网址,很明显,我们要获取的不仅仅是单独的一张图片,而是要通过点击网页链接而获取这一系列的图片。
因此,我们先解析网页,透过开发者工具定位第一张图片
这里写图片描述
可以看出在jpg格式上方有一个.html的一段字符,通过对比子网页我们可以知道这就是子网页的部分url,我们对其进行提取并拼接,就获取到了子网页的url。
进入子网页后通过开发者工具定位大图发现:
这里写图片描述

通过代码:

imgurl = soup.find_all('img',alt='')

我们发现提取到了不止我们想要的图片链接,所以我们还要对其进行清洗,用到了正则表达式。我发现只要是网页中的图片,它的图片url都会有2018这串数字,于是我用正则表达式尝试匹配了一下:

    for imgurl in imgurl:
        try:
            imgurl1 = re.findall('.*2018.*',imgurl['src'])[0]
        except:
            None

之后发现实现了,但是还是有一个弊端,就是没有去掉重复的url。
这里写图片描述

因为这两张图片的url完全一样,但是因为之后网页处理后得到的图片和名称是一样的,所以会自动替换,我就没有再处理。
下面将给出源代码,并给予注释:

#__author:'lwq'
#date: 2018/8/23

import re
import requests
from bs4 import BeautifulSoup
import os
try:#创建新文件夹,如果存在就跳过
    os.makedirs('D://python作业//two')
except:
    None

def getHtml(url):#请求网页并返回Beautifulsoup后的文本
    response = requests.get(url)
    html = response.text
    soup = BeautifulSoup(html, 'lxml')
    return soup

def getHtml1(url):#请求网页并返回二进制文本
    response = requests.get(url)
    html = response.content
    return html

def getImg(soup):#对网页返回的Beautifulsoup进行解析,该处是原网页的解析,得到子网页残缺url,以数组形式存储并返回
    imglist = []
    imgurl = soup.find_all('a')
    for imgurl in imgurl:
        try:
            urlone = re.findall('.*\d{6}.*', imgurl['href'])[0]
            imglist.append(urlone)
        except:
            None
    return imglist

def getImgurl(soup):#对网页返回的Beautifulsoup进行解析,该处是子网页的解析,第一个值返回即将创建的文件名,之后为相应的图片url,并以数组形式存储返回
    lis = []
    try:
        imgurl = soup.find_all('img',alt='')
        title = soup.find('h1').text[:-5]
        lis.append(title)
    except:
        None
    for imgurl in imgurl:
        try:
            imgurl1 = re.findall('.*2018.*',imgurl['src'])[0]
            lis.append(imgurl1)
        except:
            None
    return lis
def Write(title,img,content):#将内容写进文本,title为创建的子目录,img为写入的图片名字,content为写入的内容
    try:
        os.makedirs('D:/python作业/two/%s/'%title)
    except:
        None
    with open('D:/python作业/two/%s/'%title+'%s'%img,'ab') as fb:
        fb.write(content)
        fb.close()


if __name__ == '__main__':
    for i in range(11576):#循环1576页,因为第1页和第0页内容一样,就省去。
        url = 'http://www.mingxing.com/tuku/index?&p=%s'%i
        print('第'+str(i)+'页')
        soup =getHtml(url)
        for urlone in getImg(soup):
            urltwo = 'http://www.mingxing.com%s' % urlone
            soup1 = getHtml(urltwo)
            for urlimg in getImgurl(soup1)[1:]:
                title = getImgurl(soup1)[0]#获取子目录的名称
                try:
                    print(urlimg)
                    content = getHtml1(urlimg)
                    print(content)
                    Write(title, urlimg[-20:], content)#这里图片名称写入http会报错,所以提取后20个字符为名称,恰好还有图片格式。
                except Exception as e:
                    print(e)

因为数据太大,可能要运行很久,之后会学习到爬虫框架,它适合爬取这种大量的数据,比我们这样快了几倍。
等我熟悉了以后再进一步扩展。
可能上面会有某个库的使用不是很适当,有建议可以提出来,我也会尽量改进。

接着给大家看看部分结果图:
这里写图片描述

可以看到文件的数量,而且这还没有运行完。

这里写图片描述

也有可能这数量太多,有些人可能认为没什么用,但我只是教一下大家用法,具体怎么用,还有因时而动。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值