搞黄色是第一生产力:亲手写一个套图下载器(Python)
导读
搞黄色是第一生产力:亲手写一个小姐姐下载器(Python)
楔子没开灯的房间里,鼠标滑轮玩了命似的转动着,荧幕上的美女图片也随之像瀑布一样倾泻下来。兴许是指间的疲乏的奇妙,我的理性短暂回到被荷尔蒙占据的大脑。悲从中来。
年华易逝,红颜易老。纵使佳期被相机定格,她们曼妙的身躯也不属于我,甚至下次打开套图网站去游览,她们的踪迹都难以寻觅。我的足迹,甚至是我的存在,都将在浏览记录清除后迎来灭亡。而一无所有的我,只能一次次固执地搓动鼠标滚轮和自己的快乐发生器,像巴普洛夫的狗一样,履行自己的本能反射。
我不愿自己像一个机器一样在搞黄色。即使世界参差,人生困惑,我还是希望,我在搞黄色的时候,散发出自由意志的光芒。
北冥有赏娆其名Python。化而为虫,能爬万物。十九世纪末横贯北美大陆的那个SBR越野比赛,身负残疾的乔尼乔斯达凭借自己的漆黑意志完成了无与伦比的黄金回旋。我也意识到,我的无数次浅尝辄止,归咎于黄色精神的缺乏。今天的我头脑清晰,xing yu旺盛,开始爬虫,顺理成章。这篇分享可能会消耗您半个小时的时间来实现一个套图下载程序。
正文我对爬虫的理解就是网络请求+HTML文本分析。HTML就是我们平时看到的网页的骨架,我们关注的图片或其他内容会被一个链接嵌套到这个HTML中来。每一张图片都对应一个独一无二的链接。爬虫程序获取这个链接,向这个链接地址发送请求,并得到二进制图片数据作为返回。
准备:安装Scrapy出于方便,我们会使用一个python爬虫库scrapy。爬虫库的作用是发出请求、分析HTML树、以及伪装用户访问。事实上这些功能可以自己从零开始做到,但使用前人留下的工具会快很多。假设您已经安装了Python并基本了解如何使用。首先打开命令行(CMD/PowerShell/Bash),使用pip(python自带的包管理器)安装这个爬虫库。
pip install Scrapy复制代码 如果显示没有pip,那可能是没有把pip的地址纳入环境变量,可以执行:
python -m pip install Scrapy复制代码 如果Python也不在环境变量里,请自行检索python安装事宜以及环境变量添加方法。
准备:套图网站我就使用福娃zz124533前天在《无意中发现了一个套图网站》中分享的这个套图网站吧。取之于福,用之于福了属于是。
开始:创建爬虫
我们安装好Scrapy后,就可以直接在命令行(CMD/PowerShell/Bash)运行它。首先到一个合适的文件夹,例如下载
cd C:Users\%USERNAME%Downloads # 进入“下载”文件夹
scrapy startproject kanmeitu # 创建“看妹图”项目以及文件夹
cd kanmeitu # 进入“看妹图”
scrapy genspider meitu kanmeitu1.cc #创建名为“妹图”的爬虫复制代码 完成之后,你的文件夹大概是这个样子:
`-- kanmeitu
|-- kanmeitu
| |-- __init__.py
| |-- __pycache__
| | |-- __init__.cpython-37.pyc
| | `-- settings.cpython-37.pyc
| |-- items.py
| |-- middlewares.py
| |-- pipelines.py
| |-- settings.py
| `-- spiders
| |-- __init__.py
| |-- __pycache__
| | `-- __init__.cpython-37.pyc
| `-- meitu.py
`-- scrapy.cfg复制代码
关键点是spider文件夹下有一个meitu.py,而且它里面是这个样子:
1 import scrapy
2
3
4 class MeituSpider(scrapy.Spider):
5 name = 'meitu'
6 allowed_domains = ['kanmeitu1.cc']
7 start_urls = ['http://kanmeitu1.cc/']
8
9 def parse(self, response):
10 pass复制代码
开始:分析页面在目录页或者感兴趣的标签页面(比如女仆),在随便一个套图链接点击右键->元素审查,就可以打开对应的链接在HTML文本中的位置。
然后我们在浏览器右侧的窗口里看一看链接的特征(注意看元素的class),我们注意到我们需要的链接是在div[@class='sou-con-list']>ul>li>a里。这个页面中还有个有用的链接“下一页”,元素是下页。我们发现它有个独一无二的类型classnext。
我们点进这个链接,进入套图页面,右键图片,元素审查,发现所有的图片都在div[@class='article-content']>img里。到此为止,我们完成了页面规则的分析,接下来开始写代码。
进展:代码
随便使用一个编辑器,Windows自带的记事本也可以,替换如下内容到meitu.py。思路就在注释里。
import scrapy
from os import mkdir
from os.path import join, exists
from functools import partial
class MeituSpider(scrapy.Spider):
name = 'meitu'
def start_requests(self):
self.sing_folder = 'storage'
if not exists(self.sing_folder):
mkdir(self.sing_folder)
self.prefix = 'https://kanmeitu1.cc' #相对链接补全
start_urls = ['https://kanmeitu1.cc/e/tags/?tagname=%E5%A5%B3%E4%BB%86', #女仆
'https://kanmeitu1.cc/e/tags/?tagname=%E9%BB%91%E4%B8%9D', #嗨丝
]
for url in start_urls:
yield scrapy.Request(url = url, callback=self.parse_tag) #处理标签页
def parse_tag(self, response):
set_list = response.xpath('//div[@class="sou-con-list"]/ul/li/a/text()').getall() #所有的套图名称
set_names = [i.replace(' ', '_').replace('/', '_').replace('', "_") for i in set_list] #套图名称去空格去斜杠,防止读写错误
set_links = response.xpath('//div[@class="sou-con-list"]/ul/li/a/@href').getall() #套图链接
for name, link in zip(set_names, set_links):
if link.startswith('http'):
url = link
else:
url = self.prefix + link
if not exists(join(self.sing_folder, name)):
print(name)
mkdir(join(self.sing_folder, name))
yield scrapy.Request(url = url, callback=partial(self.parse_set, name))
next_page_url = response.xpath('//a[@class="c-n next ease"]/@href').getall() #套图链接
if len(next_page_url)>0:
url = self.prefix + next_page_url[0]
yield scrapy.Request(url = url, callback=self.parse_tag) #处理标签页
def parse_set(self, set_name, response):
img_list = response.xpath('//div[@class="article-content"]/img/@src').getall() #所有的套图名称
for i, url in enumerate(img_list):
ext = url.split('.')[-1]
filename = join(self.sing_folder, set_name, f'{i:03d}.{ext}')
yield scrapy.Request(url = url, callback=partial(self.se_img, filename))
def se_img(self, filename, response):
with open(filename, 'wb') as f:
f.write(response.body)
复制代码
收尾:伪装在开始爬取得之前,稳妥的做法是配置一个user-agent。它相当是浏览器的名字,我们要让这个爬虫程序看起来像是个浏览器。修改kanmeitu/settings.py,在对应的行:
10 BOT_NAME = 'kanmeitu' #爬虫名称, 不要改
11
12 SPIDER_MODULES = ['kanmeitu.spiders']
13 NEWSPIDER_MODULE = 'kanmeitu.spiders'
14
15
16 # Crawl responsibly by identifying yourself (and your website) on the user-agent
17 USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.64 Safari/537.36' #这个是浏览器的user agent
18
19 # Obey robots.txt rules
20 ROBOTSTXT_OBEY = False #不要遵守网站的爬取规则(一些网站会用禁止爬取)
21
22 # Configure maximum concurrent requests performed by Scrapy (default: 16)
23 CONCURRENT_REQUESTS = 8 #同一时间的最大请求数量,越大下载越快,但是被网站黑名单的概率越大复制代码
完成:开始爬取在kanmeitu文件夹下(同文件夹下还有scrapy.cfg),命令行执行scrapy crawl meitu。程序开始运行,屏幕显示出正在下载的图片。这里是一开始下载的图片们:
storage
├── [秀人XiuRen]_No.4364_一颗甜蛋黄a_78P
│ ├── 065.jpg
│ ├── 066.jpg
│ ├── 067.jpg
│ ├── 068.jpg
│ ├── 069.jpg
│ ├── 070.jpg
│ ├── 071.jpg
│ ├── 072.jpg
│ ├── 073.jpg
│ ├── 074.jpg
│ ├── 075.jpg
│ ├── 076.jpg
│ └── 077.jpg
└── [秀人XiuRen]_No.4464_王雨纯_6三人游
└── 062.jpg复制代码
写在最后很惭愧,我手头没有运行Windows的电脑,一台也没有。所以和Windows以及Python在之上安装有关的问题爱莫能助,希望您自行检索。
一开始看不懂代码也不要紧,一步一步来,慢慢改动慢慢进步,可以在评论里交流学习。
祝武运昌隆。