推荐设备MORE

抽奖微信小程序流程是甚么—

抽奖微信小程序流程是甚么—

行业新闻

漂亮美女照片网络爬虫实战演练轻轻松松抓取几

日期:2021-04-12
我要分享

我这儿应用的是Jupyter notebook开展开发设计检测。

自然还可以应用别的的开发设计自然环境,比如PyCharm。 Google访问器 :用以抓包软件剖析(别的访问器还可以,比如火狐浏览器访问器)

(更详尽的有关安裝python包的安裝这儿也不讲过,终究这一并不是新手入门实例教程)

剖析网页页面构造

网站: mn52图片库网(是靠谱的网站,沒有露点,不归属于情色范畴,是合理合法的)

这一网站是一个照片网站,內容基本全是照片,归类有许多,由于网页页面构造全是一样的,因此我这儿选择了性感漂亮美女这一归类开展剖析。

性感漂亮美女:xingganmeinv/

由于我想抓取这一归类下的全部照片,因此最先我想剖析这一url的构成。

抓取的情况下是1~220页,每一页有20图组片(即一页有20个缩列图,点一下进来才算是大家必须获得的原照)。

剖析进行以后构思以下:获得每一页的url → 获得每一页的20个

大概的构思便是那样,下边刚开始敲代码开展检测。

敲代码剖析 目录的url构成
第一页



url构成:
"  (number=1-- 200)

随后依据 Xpath表述式开展获得

//div[@id="waterfall"]/ul/li/div/a/@href

应用 Xpath表述式获得

//div/ul[@id="pictureurls"]/li/div/a/img/@src

照片取名标准 照片的种类 由于这儿的照片有 .jpg 和 .png二种文件格式,全部免费下载的照片還是必须依照这二种文件格式开展储存,全部必须获得原先照片的储存文件格式。 这儿获得照片的数据信息是依据IO流开展传送的,这儿选用二进制的方法开展传送,即字节数码方法传送,而并不是标识符。

因为每一图组片全是一样的文件格式储存的,要不是 .jpg,要不是 .png,因此我这儿仅仅了解一幅图片的储存文件格式就可以,即获得到第一幅图片的url后缀名就可以。

比如:具体的

img/allimg/190827/8-1ZRH10243.png
img/allimg/190818/8-1ZQR13348.jpg

这儿大家必须获得的是后边的四字符

因为前边早已获得了每个

# src目录下的第一个原素 (src是全部的原照url目录)
firstSrc = src[0]
# 获得标识符串的最终四字符
filetype = firstSrc[-4:]
照片的取名

因为大家必须免费下载的照片许多,将会有几万元张,乃至超出几十万张,全部一个好的取名方法看起来太重要。

这儿我依照照片原先的取名去取名,就是我必须获得到照片原先的取名名字。

在剖析检测全过程中,发了现照片取名将会存有下列二种(将会不仅二种)

img/allimg/190827/8-1ZRH10243.png
img/allimg/c160322/145VO.jpg

我这儿必须获得的是

8-1ZRH10243
145VO

因为照片种类前边早已获得来到,这儿不用再度获得。(或是还可以立即在这里里获得名字和种类,立即省去上一步获得照片种类)

这儿我应用正则表达式表述式开展获得

# src是原照的url
pattern = '\w*?\-\w+'
name = re.search(pattern,src).group()
print(name)
# src = 'img/allimg/c150926/144323X0404I0-1261301.jpg'
# 結果144323X0404I0-1261301
# src = 'img/allimg/190818/8-1ZQR14016.jpg'
# 結果8-1ZQR14016

那样大家便可以获得到照片的名字了,不管如何转变,这一正则表达式表述式应当都可以以考虑这儿的要求了。

反爬的处理

前边的工作中进行以后,我急不可耐的开展了检测。

但是却碰到了403,404不正确…

历经剖析,我觉得网站设定了防盜链

处理计划方案:

仿真模拟访问器抓取 设定header为该网页链接传出的自动跳转恳求

最终取得成功处理了。

随后免费下载了好多个钟头,免费下载了21330张性感漂亮美女照片,这儿仅仅抓取了1~120页的照片,后边的沒有再次去抓取。

全自动抓取实际效果

程序能够改善的地方 程序能够设定一个時间分辨:假如每一次恳求時间太长就绕过(避免某次恳求時间太长,导致程序假死) 设定多段程抓取(实际上这儿和开好多个程序抓取是一样大道理的,这儿觉得没必需…由于该网站测试器觉得特性不太高,开过多程序抓取,好像都没有提升是多少高效率?) 应用Scrapy架构抓取(提升高效率?)

编码写的并不是非常好,大伙儿凑合一下吧(如今关键做Java后端开发,python写的非常少了)。

import urllib.request
from lxml import etree
import re
import os
import datetime
# 免费下载照片(获得原照连接并免费下载)
def downloadImage(url,pathway):
    response = urllib.request.urlopen(url)
    content=response.read().decode(encoding='utf-8')
    dom = etree.HTML(content)
    src=dom.xpath('//div/ul[@id="pictureurls"]/li/div/a/img/@src')
    # 获得照片连接和名字并免费下载照片
    pattern = '\w+\-\w+'
    firstsrc = src[0]
    filetype = firstsrc[-4:]
    headers = [('Host',''), ('Connection', 'keep-alive'),  ('Cache-Control', 'max-age=0'),
                    ('Accept', 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3'),
                    ('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36'),
                    ('Accept-Encoding','gzip, deflate, br'),
                    ('Accept-Language', 'zh-CN,zh;q=0.9'),
                    ('If-None-Match', '5d652a1c-3d43'),
                    ('Referer','xingganmeinv/'),
                    ('If-Modified-Since', 'Tue, 27 Aug 2019 10:09:54 GMT')]
    opener = urllib.request.build_opener()
    opener.addheaders = headers
    for img in src:
        name = re.search(pattern,img).group()
        if str(img[1:4])=="img":
            imgUrl = "" + str(name) + str(filetype)  
        f = open(path,"wb")  
        f.write(data.read())  
        f.close()
        print("照片免费下载取得成功:"+imgUrl)
# 结构归类的 url
# typeNum 性感漂亮美女-- 1  甜美漂亮美女-- 2  日本漂亮美女-- 3  欧美国家照片-- 4  漂亮美女大牌明星-- 5 
def getUrl(typeNum):
    type = ""
    if typeNum==1:
        type = "xingganmeinv"
    elif typeNum==2:
        type = "meihuoxiezhen"
    elif typeNum==3:
        type = "rihanmeinv"
    elif typeNum==4:
        type = "jingyannenmo"
    elif typeNum==5:
        type = "meinvmingxing"
    url1 = ""
    url2 = "/list_"
    url = url1 + type + url2 + str(typeNum) + "_"
    return url;
# 提醒信息内容
print("################################################################################")
print("#                                                                              #")
print("#            (1)创作者:ShibaInu  mn52图片库:image                       #")
print("#                   免费下载的照片都是储存在这里个文档夹                             #")
print("#                                                                              #")
print("#            (3)== 必须键入:照片类型 Number                                  #")
print("#                   性感漂亮美女 == [ 1 ]                                          #")
print("#                   甜美漂亮美女 == [ 2 ]                                          #")
print("#                   日本漂亮美女 == [ 3 ]                                          #")
print("#                   欧美国家照片 == [ 4 ]                                          #")
print("#                   漂亮美女大牌明星 == [ 5 ]                                          #")
print("#                                                                              #")
print("#            (4)== 必须键入:免费下载的起止页和结的页码数                     #")
print("#                   起止页[ startPage ]                                        #")
print("#                   结[ endPage(不包括结)]                             #")
print("#                                                                              #")
print("################################################################################")
print("")
pathway = input("  ①请键入文档储存相对路径(比如 D:/image):")
print("")
typeNum = input("  ②请键入免费下载的类型:")
urlList = getUrl(int(typeNum))
print("")
startPage = input("  ③请键入起止页 startPage:");
print("")
endPage = input("  ④请键入结 endPage:")
print("")
print("   == 将要刚开始精彩纷呈資源的免费下载 == ")
print("")
startNum = int(startPage)
endNum = int(endPage)
startTime = datetime.datetime.now()
for n in range(startNum,endNum):
    '
    response = urllib.request.urlopen(realurl)
    content=response.read().decode(encoding='utf-8')
    dom = etree.HTML(content)
    src=dom.xpath('//div[@id="waterfall"]/ul/li/div/a/@href')
    for img in src:
        path = 'pre>
装包成 .exe能够实行文档

免费下载一张 mn52.ico 照片,将mn52pic.py 和这幅图片放到同一个文档夹下,cmd 指令行驶入这一文件目录,随后实行下边的编码装包:

pyinstaller -F -i mn52.ico mn52pic.py

因为这一照片网站测试器特性并不是十分好,因此大伙儿都不要一直开展抓取和检测,之上仅仅以便解读一下面的图片网络爬虫的简易完成。