惹火
温馨提示:本scrapy 实战,教大家爬取整个妹纸网站,妹纸4000多,图片10W多,合计10G多数据量……故取名曰:《Scrapy采花大盗小爬虫实战之:勾魂、酥胸、惹火、尤物……》!好久不见,诸君见谅!日渐稀疏的更新,大概和为人夫、为人父的原因密不可分;因为成了人夫,所以要孝敬夫人;因为成了人父,所以要扶小人、而且还要擦屎粑粑……;无论是夫人还是扶人,都需要时间和精力……饼只有一个,却被分了99.99%,那剩下的0.001%就只有今天这篇scrapy 实战,希望诸位莫嫌弃,饼虽小,但味道狠beautiful、而且十分sex,这一期我带大家去爬几个:“大、姑娘”,请注意,“大”和“姑娘”之间是有个顿号的,虽然内涵段子真的断了子,但“内涵”不该“绝孙”,那“大”希望诸君不要往邪恶的地方想,肯定是数据量大呀,难道你想的是……
一、踩点
哪既然我们要爬大姑娘,那我们需要去踩个点,好了,先度娘一下:大姑娘,对不起,大姑娘图片没搜到,却意外收获了关于“大姑娘”不为人知的秘密:
百度这知道,真是惊世骇俗!这里的话大家可以换一种说法,大姑娘搜不到,你不妨试试:美女、女孩、女子……我们应该学会变通,试搜一下:美女!
看到没?换种说法,结果能改变人生!第一条结果果断不理睬,因为是百度自家的东西,靠关系排在头条,里面没多少高质量的东西,那第二条结果:www.mm131.com 就是凭本事排名的,里面应该都有诸君想要的东东,你不优秀,是不可能出头的,这条规则不仅适用于人事,也适于互联网,那就点进去一探究竟!
可以看到,虽然不是狠高大上、但绝对的干净,比起你看的神马:…sese.com、xxx.com……全是赌博的闪图、弹窗……是不是狠舒服?好了,那我们就向TA下手,随便点开一个图片,看看她是怎么展现
可以看到,站长还是有点别有用心,他不是把每一个妹子放在一个页面,而是把一个妹子的多张图片放在了多个页面,这样的好处当然是SEO,不然人家怎么会排在第一呢?
二、明确需求
侦查好网站,那接下来就需要明确需求,这一部分狠重要,关乎我们代码怎么写。比如我们要把这些数据拿去再做一个类似的网站或是APP,那照片你肯定需要归类,也就是A姑娘的所有靓照,你需要把它放一个文件夹;B姑娘的你需要放在B姑娘文件夹……这样的回报就是你在二次利用的时候灰常的方便;当然,如果你不想二次利用只是想一饱眼福,那不分类也行,把所有的图片都放在一个文件里,百花齐放,未免不是一种xing福。对比起来,第二种需求比较简单,我们只需要大概的看看这个网站的最终url,就可以大致确定图片的张数,然后累加就可以把大概的图片拿下来;这种方法简单,不多说;要玩就玩点难点的,横跨过大海的人,小河小沟也就不再话下了。那我们的目的就很明确了:把每一妹子的图片放入以标题命名的文件夹内,文件夹内的图片命名方式,1、2、3、4……递增排序,先把结果拿来给诸位看看:
诸君请把眼光放在目录结构和文件命名上,至于内容,请忽略,如果可以的话!
三、编写代码
接下来开始编写代码,首先创建项目:
scrapy startproject Aoisolas
item.py编写主要是定义我们要爬取的字段,其实这里就两个文件夹名称,图片url,代码如下:
import scrapy
class AoisolasItem(scrapy.Item):
# define the fields for your item here like:
name = scrapy.Field()
ImgUrl = scrapy.Field()
pass
至于项目名称,我是这样命名的 Aoisola + s,Aoisola是神马意思?不知道?我也不知道……想一探究竟不如百度一下;接下来在spider目录下创建蜘蛛文件:AoiSolaSpider.py,看一下目录结构:
接下来,编写爬虫文件:
# -*- coding: utf-8 -*-
import scrapy
from AoiSolas.items import AoisolasItem
class AoisolaspiderSpider(scrapy.Spider):
name = "AoiSola"
allowed_domains = ["www.mm131.com"]
start_urls = ['http://www.mm131.com/xinggan/',
'http://www.mm131.com/qingchun/',
'http://www.mm131.com/xiaohua/',
'http://www.mm131.com/chemo/',
'http://www.mm131.com/qipao/',
'http://www.mm131.com/mingxing/'
]
def parse(self, response):
list = response.css(".list-left dd:not(.page)")
for img in list:
imgname = img.css("a::text").extract_first()
imgurl = img.css("a::attr(href)").extract_first()
imgurl2 = str(imgurl)
print(imgurl2)
next_url = response.css(".page-en:nth-last-child(2)::attr(href)").extract_first()
if next_url is not None:
# 下一页
yield response.follow(next_url, callback=self.parse)
yield scrapy.request(imgurl2, callback=self.content)
def content(self, response):
item = AoisolasItem()
item['name'] = response.css(".content h5::text").extract_first()
item['ImgUrl'] = response.css(".content-pic img::attr(src)").extract()
yield item
# 提取图片,存入文件夹
# print(item['ImgUrl'])
next_url = response.css(".page-ch:last-child::attr(href)").extract_first()
if next_url is not None:
# 下一页
yield response.follow(next_url, callback=self.content)
图片下载中间件:pipelines.py编写:
from scrapy.pipelines.images import ImagesPipeline
from scrapy.exceptions import DropItem
from scrapy.http import Request
import re
class MyImagesPipeline(ImagesPipeline):
#
# def file_path(self, request, response=None, info=None):
# """
# :param request: 每一个图片下载管道请求
# :param response:
# :param info:
# :param strip :清洗windows系统的文件夹非法字符,避免无法创建目录
# :return: 每套图的分类目录
# """
# item = request.meta['item']
# folder = item['name']
#
# folder_strip = re.sub(r'[?\\*|“<>:/]', '', str(folder))
# image_guid = request.url.split('/')[-1]
# filename = u'full/{0}/{1}'.format(folder_strip, image_guid)
# return filename
def get_media_requests(self, item, info):
for image_url in item['ImgUrl']:
yield Request(image_url,meta={'item':item['name']})
def file_path(self, request, response=None, info=None):
name = request.meta['item']
# name = filter(lambda x: x not in '()0123456789', name)
name = re.sub(r'[?\\*|“<>:/()0123456789]', '', name)
image_guid = request.url.split('/')[-1]
# name2 = request.url.split('/')[-2]
filename = u'full/{0}/{1}'.format(name, image_guid)
return filename
# return 'full/%s' % (image_guid)
def item_completed(self, results, item, info):
image_path = [x['path'] for ok, x in results if ok]
if not image_path:
raise DropItem('Item contains no images')
item['image_paths'] = image_path
return item
setting.py设置:爬虫写好、中间件也写好、别忘了设置启动中间件,还有图片需要下载了放那,都是setting的事,接下来设置哈:
# 设置图片存储路径
IMAGES_STORE = 'D:\meizi2'
#启动pipeline中间件
ITEM_PIPELINES = {
'AoiSolas.pipelines.MyImagesPipeline': 300,
}
啰嗦几句,中间件的MyImages……你需要设置为你命名的,若你命名的不是和我的一样而设置的一样,那恭喜你肯定出错,这是很多小伙伴没注意到的地方,希望能引起你的重视!经过这么几个步骤,按理说启动爬虫我们的图片就能乖乖躺在我们设置的目录里面的,爱你胃,其实并没有,我们惊讶的发现,里面没有妹子,只有腾讯的logo,神马鬼?接下来才是正真展示技术的时候,这也是本scrapy 实战最值得看的看点!若你的爬虫只能欺负一些没有反爬虫限制的网站,那你就像用枪指着手无寸铁的平民一样,算神马英雄?要欺负就欺负反爬虫网站,好了接下来就开始欺负她!
要想反反爬虫,你必须明白反爬虫技术实现的要点,如现在遇到的诡异情况,我们爬A站的图片,为神马会得到B站的logo,莫非冥冥之中我们练就了隔山打牛?其实不然,如果你真正运营过优质的网站,你就会明白这其实只是一种防盗链技术,简单的说防盗链就是为了防止A站把B站的资源直接拿去用,而做的一种阻止技术;就用这妹子网站来解释,本来这些妹子图片都是在妹子网站的服务器上,另一个网站看到做的不错,也想做一个,他就想把妹子网站的图片链接直接拿过来就可以了,这样的话图片是显示在自己网站,但处理图片的服务器却是妹子网站的,典型的损人利己!防盗链就是为了防止这么一种情况,让你盗链的链接不显示,呵呵……
那肿么破解呢?这里我们就需要知道防盗链的本质,其实很简单,防盗链的核心是判断你请求的地址是不是来自本服务器,若是,则给你图片,不是则不给,知道了这么一个原则我们就可以破解了,我们每下载一张图片都先伪造一个妹子服务器的请求,然后在下载,那它肯定会给你返回图片,于是我们就能顺利拿到图片!那问题的重点就归结为如何伪造请求地址,scrapy实现起来灰常简单,就是写一个Middleware,代码如下:
class AoisolasSpiderMiddleware(object):
def process_request(self, request, spider):
referer = request.url
if referer:
request.headers['referer'] = referer
就这么几行代码,就能轻松破解她的防盗链,然后别忘了在settings里面启动middleware,如下:
DOWNLOADER_MIDDLEWARES = {
'AoiSolas.middlewares.AoisolasSpiderMiddleware': 1,
}
最后,运行蜘蛛:
scrapy crawl AoiSola
效果:
GitHub源码:GitHub源码
注意:代理!!
原文参考:点击打开链接
肯定不是我写的!!猥琐!
相关阅读
主要是因为SEO的路非常艰辛,菠菜公司的SEO更加困难,也很少有成功者将自己的推广历程、经验拿出来分享。由于各行各业都竞争激烈,大部
看着自己写的文章浏览数一点一点增加是非常开心的,但总感觉浏览数增长地太慢了,于是自然想到,为什么不能写一个小程序自动刷博客浏览
云栖君导读:你还在用面向对象的语言写面向过程的代码吗?你是否正在被复杂的业务逻辑折磨?是否有时觉得应用开发
目标站点与分析 访问http://www.globaltimes.cn 站点,可以看到目标站点分为几大新闻板块,大板块下还有其他子板块,其中还包含了视频
各位读者大人们好,不知道各位读者大人们近来如何。由于前段时间事情比较多,文章的更新就给耽误了,项目需要上线经常加班,再加上自己的