爬取妹子图片,利用Python写二个爬妹子的爬虫

作者: 韦德国际1946手机版  发布:2019-05-28

前言

环境:

python 3.6
爬取妹子图片,利用Python写二个爬妹子的爬虫。PyCharm 2017

Python 爬虫入门

听大人说您写代码没重力?本文就给您重力,爬取妹子图。若是那也没引力那就没救了。

GitHub 地址:

公众号:【智能创立专栏】。招待关心,分享智能创立与编制程序那个事。

   高校的服务器能够上国外国语高校网了,所以计划写贰个电动爬嘲弄话并发到bbs的事物,从网上搜了一个笑话网站,觉稳妥先八分之四还不太冷,html结构如下:图片 1

新近学完Python,写了多少个爬虫练练手,英特网的教程有繁多,可是部分已经无法爬了,首假诺网址经常改,可是爬虫照旧有通用的思路的,即下载数据、分析数据、保存数据。上边11来说。

其3方库

requests:解析url
beautifulsoup四:不会正则表达式童鞋的佛法,能够轻巧的提取到html文件中各样标签及其性质

安装方式:(进入python安装根目录)
pip install requests
pip install beautifulsoup4

壹旦有不当请自行化解

爬虫成果

图片 2

当你运行代码后,文件夹就能够越来越多,假诺爬完的话会有两千多个公文夹,三千0多张图片。然而会很耗费时间间,能够在终极的代码设置爬取页码范围。

 能够看来,笑话的链接列表都在<div class="list_title">里面,用正则表明式能够把多年来的多少个笑话地址搜索来,再进到3个嘲谑页面看下:图片 3

1.下载数据

目标

http://mzitu.com
话说回来,笔者半年前就初阶上学py爬虫,但随即应有是兴趣不足,导致半途而废,所以说兴趣相当主要,大家的靶子应该能够使大家有异常的大的兴味,激励本人上学爬虫。

本文指标

  1. 熟悉 Requests 库,Beautiful Soup 库
  2. 深谙多线程爬取
  3. 送福利,妹子图

  每二个嘲谑页面里面是有多个小笑话组成的,全部在<span id="text1拾">标签下,每种小笑话又单独二个<p>包裹,那样极其轻松就能够把种种独立笑话放到一个list中。由于自个儿爬笑话的指标是每一天白天四个钟头发一个笑话,所以爬取十八个是十足的了,各样页面平均有七个小笑话,爬两个页面就OK啦。这里有多少个细节,那些笑话网有的链接是有中文的,举个例子:

率先展开要爬的网址,分析U奥迪Q5L,每打开三个网页看UXC60L有何变化,有十分的大可能率带上上个网页的某部数据,举例xxID之类,那么咱们就需求在上八个页面深入分析HTML,找到相应的数目。借使网页源码找不到,大概是ajax异步加载,去xhr里去找。

原理

学学爬虫,首先是要读书它的法则。张开网站(为了以免协调作者就不上图了 ),我们能够开掘,一共有1四一页,每页都有广大套图,假如要你手动去保存,怎么操作?作者想应该是这样,从第一页开首,点进第2个套图,然后保留每张图纸,然后举行第②个套图……第3页完了后头第贰页,从第三个套图开头,保存保存……这便是规律,当然,即使这么能完毕这几个目标,但我们应该未有那么多的小时,那么大家就来学学爬虫,来替大家保留图片。

网址协会

我们从 那些链接进去,分界面如图一所示

图一:
图片 4

能够看看是一组一组的套图,点击任何1组图片会跻身到详细情形分界面,如图2所示

图二:

图片 5

能够看到图片是种种排开的,一般会有十张左右的图形。

1 <a href="/jokehtml/冷笑话/2014051200030765.htm" target="_blank">读书破万卷,搞笑如有神</a>  

 图片 6

步骤

实现思路

看了分界面包车型大巴结构,那么大家的思路就有了。

  1. 结构 url 链接,去央浼图一所示的套图列表分界面,得到每3个页面中的套图列表。
  2. 个别进入各种套图中去,下载相应的图样。

直接urllib.request.urlopen函数不可能剖析粤语的ULX570L,必要求urllib.parse先转码一下本事科学解析。还恐怕有3个细节是每段的小笑话之间是有换行的,用正则表达式的“.”是不能相配换行符的,要求改成“[wW]”本领协作。好了,下边是代码:

局地网址做了反爬的拍卖,能够增加User-Agent :决断浏览器

一.获取网页源码

用浏览器的F12方可知到网页的源码,但大家今后要用python那样做。

#coding=utf-8

import requests

url = 'http://www.mzitu.com'

#设置headers,网站会根据这个判断你的浏览器及操作系统,很多网站没有此信息将拒绝你访问
header = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 UBrowser/6.1.2107.204 Safari/537.36'}

#用get方法打开url并发送headers
html = requests.get(url,headers = header)

#打印结果 .text是打印出文本信息即源码
print(html.text)

假诺没难题的话结果会是这般好像

图片 7

这几个就是网页的源码了。

代码表明

  1. 下载界面的函数,利用 Requests 很有益实现。

    def download_page(url):
        '''
        用于下载页面
        '''
        headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:61.0) Gecko/20100101 Firefox/61.0"}
        r = requests.get(url, headers=headers)
        r.encoding = 'gb2312'
        return r.text
    
  2. 获取图1所示的享有套图列表,函数中 link 表示套图的链接,text表示套图的名字

    def get_pic_list(html):
        '''
        获取每个页面的套图列表,之后循环调用get_pic函数获取图片
        '''
        soup = BeautifulSoup(html, 'html.parser')
        pic_list = soup.find_all('li', class_='wp-item')
        for i in pic_list:
            a_tag = i.find('h3', class_='tit').find('a')
            link = a_tag.get('href')  # 套图链接
            text = a_tag.get_text()   # 套图名字
            get_pic(link, text)
    
  3. 流传上一步中收获到的套图链接及套图名字,获取每组套图里面包车型地铁图片,并保留,作者在代码中注释了。

    def get_pic(link, text):
        '''
        获取当前页面的图片,并保存
        '''
        html = download_page(link)  # 下载界面
        soup = BeautifulSoup(html, 'html.parser')
        pic_list = soup.find('div', id="picture").find_all('img')  # 找到界面所有图片
        headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:61.0) Gecko/20100101 Firefox/61.0"}
        create_dir('pic/{}'.format(text))
        for i in pic_list:
            pic_link = i.get('src')  # 拿到图片的具体 url
            r = requests.get(pic_link, headers=headers)  # 下载图片,之后保存到文件
            with open('pic/{}/{}'.format(text, pic_link.split('/')[-1]), 'wb') as f:
                f.write(r.content)
                time.sleep(1)
    
 1 import urllib.request  
 2 import urllib.parse  
 3 import re  
 4   
 5 rule_joke=re.compile('([wW]*?)')  
 6 rule_url=re.compile('<a href="(.*?)"target="_blank" >')  
 7 mainUrl='http://www.jokeji.cn'  
 8 url='http://www.jokeji.cn/list.htm'  
 9   
10 req=urllib.request.urlopen(url)  
11 html=req.read().decode('gbk')  
12 urls=rule_url.findall(html)  
13 f=open('joke.txt','w')  
14 for i in range(4):  
15     url2=urllib.parse.quote(urls[i])  
16     joke_url=mainUrl url2  
17     req2=urllib.request.urlopen(joke_url)  
18     html2=req2.read().decode('gbk')  
19     joke=rule_joke.findall(html2)  
20     jokes=joke[0].split('<P>')  
21       
22     for i in jokes:  
23         i=i.replace('</P>','')  
24         i=i.replace('<BR>','')  
25         i=i[2:]  
26         f.write(i)  
27 f.close()  
self.user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
# 初始化 headers
self.headers = {'User-Agent': self.user_agent}

贰.物色所需音讯

切换浏览器,右键‘查看网页源代码’,能够窥见有诸多如此的新闻

<li>
  <a href="http://www.mzitu.com/89334" target="_blank"><img width='236' height='354' class='lazy' alt='我是标题我是标题我是标题我是标题我是标题我是标题' src='http://i.meizitu.net/pfiles/img/lazy.png' data-original='http://i.meizitu.net/thumbs/2017/04/89334_02b06_236.jpg' /></a>
  <a href="http://www.mzitu.com/89334" target="_blank">我是标题我是标题我是标题我是标题我是标题我是标题我是标题我是标题我是标题我是标题</a>
  2017-04-026,788次
</li>

那么大家只须要领取那些东西就足以了…but:作者写不出这么复杂的正则!!!不妨,我们的神器BeautifulSoup要出演了!
我们的步子是:1将获得的源码调换为BeautifulSoup对象二寻觅供给的数码

#coding=utf-8

import requests
from bs4 import BeautifulSoup

url = 'http://www.mzitu.com'
header = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 UBrowser/6.1.2107.204 Safari/537.36'}

html = requests.get(url,headers = header)

#使用自带的html.parser解析,速度慢但通用
soup = BeautifulSoup(html.text,'html.parser')

#实际上是第一个class = 'postlist'的div里的所有a 标签是我们要找的信息
all_a = soup.find('div',class_='postlist').find_all('a',target='_blank')

for a in all_a:
    title = a.get_text() #提取文本
    print(title)

那般就找到了当页全部套图的标题

注意:
BeautifulSoup()重回的品种是<class 'bs四.BeautifulSoup'>
find()再次回到的系列是<class 'bs四.element.Tag'>
find_all()重临的品类是<class 'bs四.element.ResultSet'>
<class 'bs四.element.ResultSet'>无法再进项find/find_all操作

全体代码

完整代码如下,包涵了创设文件夹,利用二十多线程爬取,小编设置的是伍个线程,能够依据本人机器自身来设置一下。

import requests
import os
import time
import threading
from bs4 import BeautifulSoup


def download_page(url):
    '''
    用于下载页面
    '''
    headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:61.0) Gecko/20100101 Firefox/61.0"}
    r = requests.get(url, headers=headers)
    r.encoding = 'gb2312'
    return r.text


def get_pic_list(html):
    '''
    获取每个页面的套图列表,之后循环调用get_pic函数获取图片
    '''
    soup = BeautifulSoup(html, 'html.parser')
    pic_list = soup.find_all('li', class_='wp-item')
    for i in pic_list:
        a_tag = i.find('h3', class_='tit').find('a')
        link = a_tag.get('href')
        text = a_tag.get_text()
        get_pic(link, text)


def get_pic(link, text):
    '''
    获取当前页面的图片,并保存
    '''
    html = download_page(link)  # 下载界面
    soup = BeautifulSoup(html, 'html.parser')
    pic_list = soup.find('div', id="picture").find_all('img')  # 找到界面所有图片
    headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:61.0) Gecko/20100101 Firefox/61.0"}
    create_dir('pic/{}'.format(text))
    for i in pic_list:
        pic_link = i.get('src')  # 拿到图片的具体 url
        r = requests.get(pic_link, headers=headers)  # 下载图片,之后保存到文件
        with open('pic/{}/{}'.format(text, pic_link.split('/')[-1]), 'wb') as f:
            f.write(r.content)
            time.sleep(1)   # 休息一下,不要给网站太大压力,避免被封


def create_dir(name):
    if not os.path.exists(name):
        os.makedirs(name)


def execute(url):
    page_html = download_page(url)
    get_pic_list(page_html)


def main():
    create_dir('pic')
    queue = [i for i in range(1, 72)]   # 构造 url 链接 页码。
    threads = []
    while len(queue) > 0:
        for thread in threads:
            if not thread.is_alive():
                threads.remove(thread)
        while len(threads) < 5 and len(queue) > 0:   # 最大线程数设置为 5
            cur_page = queue.pop(0)
            url = 'http://meizitu.com/a/more_{}.html'.format(cur_page)
            thread = threading.Thread(target=execute, args=(url,))
            thread.setDaemon(True)
            thread.start()
            print('{}正在下载{}页'.format(threading.current_thread().name, cur_page))
            threads.append(thread)


if __name__ == '__main__':
    main()

好了,之后运行,大家的爬虫就能够努力的为大家下载美貌堂妹啊。

看下爬取的结果:

假诺那多少个,在Chrome上按F1二分析请求头、请求体,看需无需加多别的音信,比方某些网站加多了referer:记住当前网页的来源于,那么大家在呼吁的时候就足以带上。按Ctrl

3.进入下载

点进贰个套图之后,开掘她是每一种页面显示一个图纸。
比如http://www.mzitu.com/26685是有些套图的第二页,后边的页数都是再后边跟/和数字http://www.mzitu.com/26685/2 (第二页),那么很简单了,大家只要求找到他一同多少页,然后用循环组成页数就OK了。

#coding=utf-8

import requests
from bs4 import BeautifulSoup

url = 'http://www.mzitu.com/26685'
header = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 UBrowser/6.1.2107.204 Safari/537.36'}

html = requests.get(url,headers = header)
soup = BeautifulSoup(html.text,'html.parser')

#最大页数在span标签中的第10个
pic_max = soup.find_all('span')[10].text
print(pic_max)

#输出每个图片页面的地址
for i in range(1,int(pic_max)   1):
    href = url '/' str(i)
    print(href)

图片 8

好了,那么大家接下去正是拓展搜寻图片地址并且保留了,右键妹纸图片,“检查”可以窥见 (在浏览器中浏览图片,win用户按F1二查看网页新闻,那就是图片具体音信)

<img src="http://i.meizitu.net/2014/07/20140711w11.jpg" alt="Beautyleg 美腿写真 No.997 Dora">

那正是说那正是图片的具体地址了
那正是说大家的目标将在到达,保存它。

#coding=utf-8

import requests
from bs4 import BeautifulSoup

url = 'http://www.mzitu.com/26685'
header = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 UBrowser/6.1.2107.204 Safari/537.36'}

html = requests.get(url,headers = header)
soup = BeautifulSoup(html.text,'html.parser')

#最大页数在span标签中的第10个
pic_max = soup.find_all('span')[10].text

#找标题
title = soup.find('h2',class_='main-title').text

#输出每个图片页面的地址
for i in range(1,int(pic_max)   1):
    href = url '/' str(i)
    html = requests.get(href,headers = header)
    mess = BeautifulSoup(html.text,"html.parser")


    #图片地址在img标签alt属性和标题一样的地方
    pic_url = mess.find('img',alt = title)

    html = requests.get(pic_url['src'],headers = header)

    #获取图片的名字方便命名
    file_name = pic_url['src'].split(r'/')[-1]

    #图片不是文本文件,以二进制格式写入,所以是html.content
    f = open(file_name,'wb')
    f.write(html.content)
    f.close()

不出意外你脚本所在的地点会有1贰张图纸

图片 9

  • Shift C,能够一定成分在HTML上的职位

四.批量下载

上边讲了何等下载二个套图,其实具备的套图下载只是加上两重循环。成品如下:

#coding=utf-8
import requests
from bs4 import BeautifulSoup
import os
import sys
'''
#安卓端需要此语句
reload(sys)
sys.setdefaultencoding('utf-8')
'''

if(os.name == 'nt'):
        print(u'你正在使用win平台')
else:
        print(u'你正在使用linux平台')

header = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 UBrowser/6.1.2107.204 Safari/537.36'}
#http请求头
all_url = 'http://www.mzitu.com'
start_html = requests.get(all_url,headers = header)

#保存地址
path = 'D:/mzitu/'

#找寻最大页数
soup = BeautifulSoup(start_html.text,"html.parser")
page = soup.find_all('a',class_='page-numbers')
max_page = page[-2].text


same_url = 'http://www.mzitu.com/page/'
for n in range(1,int(max_page) 1):
    ul = same_url str(n)
    start_html = requests.get(ul, headers=header)
    soup = BeautifulSoup(start_html.text,"html.parser")
    all_a = soup.find('div',class_='postlist').find_all('a',target='_blank')
    for a in all_a:
        title = a.get_text() #提取文本
        if(title != ''):
            print("准备扒取:" title)

            #win不能创建带?的目录
            if(os.path.exists(path title.strip().replace('?',''))):
                    #print('目录已存在')
                    flag=1
            else:
                os.makedirs(path title.strip().replace('?',''))
                flag=0
            os.chdir(path   title.strip().replace('?',''))
            href = a['href']
            html = requests.get(href,headers = header)
            mess = BeautifulSoup(html.text,"html.parser")
            pic_max = mess.find_all('span')
            pic_max = pic_max[10].text #最大页数
            if(flag == 1 and len(os.listdir(path title.strip().replace('?',''))) >= int(pic_max)):
                print('已经保存完毕,跳过')
                continue
            for num in range(1,int(pic_max) 1):
                pic = href '/' str(num)
                html = requests.get(pic,headers = header)
                mess = BeautifulSoup(html.text,"html.parser")
                pic_url = mess.find('img',alt = title)
                html = requests.get(pic_url['src'],headers = header)
                file_name = pic_url['src'].split(r'/')[-1]
                f = open(file_name,'wb')
                f.write(html.content)
                f.close()
            print('完成')
    print('第',n,'页完成')

  这样,每行是五个独门的嘲讽,方便其余程序行使。

动态网页

伍.升任多进程版

#coding=utf-8
import requests
from bs4 import BeautifulSoup
import os
from multiprocessing import Pool
import sys


def find_MaxPage():
    all_url = 'http://www.mzitu.com'
    start_html = requests.get(all_url,headers = header)
    #找寻最大页数
    soup = BeautifulSoup(start_html.text,"html.parser")
    page = soup.find_all('a',class_='page-numbers')
    max_page = page[-2].text
    return max_page

def Download(href,header,title,path):
    html = requests.get(href,headers = header)
    soup = BeautifulSoup(html.text,'html.parser')
    pic_max = soup.find_all('span')
    pic_max = pic_max[10].text  # 最大页数
    if(os.path.exists(path title.strip().replace('?','')) and len(os.listdir(path title.strip().replace('?',''))) >= int(pic_max)):
        print('已完毕,跳过' title)
        return 1
    print("开始扒取:"   title)
    os.makedirs(path title.strip().replace('?',''))
    os.chdir(path   title.strip().replace('?',''))
    for num in range(1,int(pic_max) 1):
        pic = href '/' str(num)
        #print(pic)
        html = requests.get(pic,headers = header)
        mess = BeautifulSoup(html.text,"html.parser")
        pic_url = mess.find('img',alt = title)
        html = requests.get(pic_url['src'],headers = header)
        file_name = pic_url['src'].split(r'/')[-1]
        f = open(file_name,'wb')
        f.write(html.content)
        f.close()
    print('完成' title)

def download(href,header,title):

    html = requests.get(href,headers = header)
    soup = BeautifulSoup(html.text,'html.parser')
    pic_max = soup.find_all('span')
    #for j in pic_max:
        #print(j.text)
    #print(len(pic_max))
    pic_max = pic_max[10].text  # 最大页数
    print(pic_max)


'''
#安卓端需要此语句
reload(sys)
sys.setdefaultencoding('utf-8')
'''


if __name__=='__main__':
    if (os.name == 'nt'):
        print(u'你正在使用win平台')
    else:
        print(u'你正在使用linux平台')

    header = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 UBrowser/6.1.2107.204 Safari/537.36'}
    # http请求头
    path = 'D:/mzitu/'
    max_page = find_MaxPage()
    same_url = 'http://www.mzitu.com/page/'

    #线程池中线程数
    pool = Pool(5)
    for n in range(1,int(max_page) 1):
        each_url = same_url str(n)
        start_html = requests.get(each_url, headers=header)
        soup = BeautifulSoup(start_html.text, "html.parser")
        all_a = soup.find('div', class_='postlist').find_all('a', target='_blank')
        for a in all_a:
            title = a.get_text()  # 提取文本
            if (title != ''):
                href = a['href']
                pool.apply_async(Download,args=(href,header,title,path))
    pool.close()
    pool.join()
    print('所有图片已下完')

图片 10

本文由韦德国际1946发布于韦德国际1946手机版,转载请注明出处:爬取妹子图片,利用Python写二个爬妹子的爬虫

关键词: python 1946韦德国际

上一篇:api接口详解,restful风格接口
下一篇:没有了