欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-06-08 16:01:52
...

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

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

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

通过代码:

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

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

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

之后发现实现了,但是还是有一个弊端,就是没有去掉重复的url。
python爬虫简易到进阶实战篇——(4)

因为这两张图片的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)

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

接着给大家看看部分结果图:
python爬虫简易到进阶实战篇——(4)

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

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

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

相关标签: 新手