Python网络爬虫 | Scrapy爬取妹子图网站全站照片
根据现有的知识,写了一个下载妹子图(meizitu.com)Scrapy脚本,把全站两万多张照片下载到了本地。
网站的分析
网页的网址分析
打开网站,发现网页的网址都是以
http://www.meizitu.com/a/+某个数+.html组成,
例如:http://www.meizitu.com/a/5585.html
于是,我就想着在 start_urls 中就按照这三部分来组合。
name = 'meizi'
allowed_domains = ['www.meizitu.com']
baseURL = 'http://www.meizitu.com/a/'
offset = 4633
end = '.html'
start_urls = [baseURL+str(offset)+end]
网页的页面分析
打开某一页网址,图片的链接在 id="picture"下的 img 标签下,
获取图片地址:
srcs = response.css("#picture img::attr(src)").extract()
写一个循环,遍历网站所有网址:
for src in srcs :
item = MeizituItem()
item['picLink'] = src
print(src)
yield item
self.offset +=1
写一个打印函数,便于监视程序运行情况:
print('addr'+str(self.offset))
if self.offset > 5586:
return
time.sleep(1)
url = self.baseURL + str(self.offset)+self.end
print ("url:"+url)
交给 Request 进行下载
yield scrapy.Request(url, callback=self.parse)
Spider 函数全部代码
# -*- coding: utf-8 -*-
import scrapy
from meizitu.items import MeizituItem
import time
class MeiziSpider(scrapy.Spider):
name = 'meizi'
allowed_domains = ['www.meizitu.com']
baseURL = 'http://www.meizitu.com/a/'
offset = 4633
end = '.html'
start_urls = [baseURL+str(offset)+end]
def parse(self, response):
srcs = response.css("#picture img::attr(src)").extract()
for src in srcs :
item = MeizituItem()
item['picLink'] = src
print(src)
yield item
self.offset +=1
print('addr'+str(self.offset))
if self.offset > 5586: #stop at 5400,for 404
return
time.sleep(1)
url = self.baseURL + str(self.offset)+self.end
print ("url:"+url)
yield scrapy.Request(url, callback=self.parse)
细心地同学可能看到了,offset = 4633 为什么不是从 1 开始? 这是因为可能是建站时间的原因,之前的网站里的图片都是在 class="postContent"下的 img 标签里的
这部分 CSS 解析为:
srcs = response.css(".postContent img::attr(src)").extract()
所以,想要爬取整个网站的图片,得分为两部分。爬完一半后,把 CSS 解析替换掉就可以了。
修改 Pipelines,下载图片
import scrapy
from scrapy.pipelines.images import ImagesPipeline
class MeizituPipeline(ImagesPipeline):
def get_media_requests(self, item, info):
pic_link = item['picLink']
print('pic_url'+pic_link)
yield scrapy.Request(pic_link)
修改 items
import scrapy
class MeizituItem(scrapy.Item):
picLink = scrapy.Field()
设置 settings
BOT_NAME = 'meizitu'
SPIDER_MODULES = ['meizitu.spiders']
NEWSPIDER_MODULE = 'meizitu.spiders'
IMAGES_STORE = "image"
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; …) Gecko/20100101 Firefox/58.0'
ROBOTSTXT_OBEY = False
ITEM_PIPELINES = {
'meizitu.pipelines.MeizituPipeline': 300,
}
写一个 main 函数,在 PyCharm 中执行
import sys
import os
sys.path.append(os.path.dirname(os.path.abspath(__file__)))
execute(["scrapy", "crawl", "meizi"])
通过实时看着程序运行,爬下来接近三万张照片,1.8G。挑了几张不漏的。。。。
http://www.aibbt.com/a/18101.html
Python网络爬虫 | Scrapy爬取妹子图网站全站照片的更多相关文章
- python网络爬虫《爬取get请求的页面数据》
一.urllib库 urllib是python自带的一个用于爬虫的库,其主要作用就是可以通过代码模拟浏览器发送请求.其常被用到的子模块在python3中的为urllib.request和urllib. ...
- python网络爬虫--简单爬取糗事百科
刚开始学习python爬虫,写了一个简单python程序爬取糗事百科. 具体步骤是这样的:首先查看糗事百科的url:http://www.qiushibaike.com/8hr/page/2/?s=4 ...
- Python网络爬虫_爬取Ajax动态加载和翻页时url不变的网页
1 . 什么是 AJAX ? AJAX = 异步 JavaScript 和 XML. AJAX 是一种用于创建快速动态网页的技术. 通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新 ...
- Python 2.7和3.6爬取妹子图网站单页测试图片
1.url= http://www.mzitu.com/74100/x,2为1到23的值 2.用到模块 os 创建文件目录; re模块正则匹配目录名 图片下载地址; time模块 限制下载时间;req ...
- Python 2.7_爬取妹子图网站单页测试图片_20170114
1.url= http://www.mzitu.com/74100/x,2为1到23的值 2.用到模块 os 创建文件目录; re模块正则匹配目录名 图片下载地址; time模块 限制下载时间;req ...
- 初识python 之 爬虫:爬取某电影网站信息
注:此代码仅用于个人爱好学习使用,不涉及任何商业行为! 话不多说,直接上代码: 1 #!/user/bin env python 2 # author:Simple-Sir 3 # time:201 ...
- Python协程爬取妹子图(内有福利,你懂得~)
项目说明: 1.项目介绍 本项目使用Python提供的协程+scrapy中的选择器的使用(相当好用)实现爬取妹子图的(福利图)图片,这个学会了,某榴什么的.pow(2, 10)是吧! 2.用到的知 ...
- Python3爬虫系列:理论+实验+爬取妹子图实战
Github: https://github.com/wangy8961/python3-concurrency-pics-02 ,欢迎star 爬虫系列: (1) 理论 Python3爬虫系列01 ...
- 第三百三十四节,web爬虫讲解2—Scrapy框架爬虫—Scrapy爬取百度新闻,爬取Ajax动态生成的信息
第三百三十四节,web爬虫讲解2—Scrapy框架爬虫—Scrapy爬取百度新闻,爬取Ajax动态生成的信息 crapy爬取百度新闻,爬取Ajax动态生成的信息,抓取百度新闻首页的新闻rul地址 有多 ...
随机推荐
- VS2010+opencv2.4.10+gsl_1.8配置实现RobHess的SIFT程序
最近在做sift方面的毕业设计,弄了一天终于把RobHess的SIFT程序调通了.虽然网上有很多相关博文,但是我还是想把我的调试的过程跟大家分享一下.由于工程没法在博文上传,所以有需要的可以在下方留言 ...
- ubuntu下smb的配置
PS: 转自Ubuntu中文论坛 -------------------------------------------------------------------------------- ...
- Angular4---部署---Angular 与 Nginx的邂逅
Nginx + Angular结合操作 1.下载Nginx , 根据自己的版本下载Nginx,关于Nginx配置,请看https://www.cnblogs.com/MBirds/p/6605366. ...
- 恢复linux系统文件夹颜色
/etc/DIR_COLORS 默认值 # Background color codes:# 40=black 41=red 42=green 43=yellow 44=blue 45=magenta ...
- 一个shell脚本给客户使用服务器生成一个序列号
#!/bin/bash interface=`ls /sys/class/net|grep en|awk 'NR==1{print}'` if [ ! -e /etc/adserver/.seq.in ...
- Go学习笔记02-源码
第二部分 源码 基于 Go 1.4,相关文件位于 src/runtime 目录.文章忽略了 32bit 代码,有兴趣的可自行查看源码文件.为便于阅读,示例代码做过裁剪. 1. Memory Alloc ...
- 请小心使用 ng-repeat 中的 $index
自己自学的时候,遇到$index不知道它是如何使用的,所以上网搜了一下,发现了这个关于使用$index可能会出现的一个小BUG,和大家分享一下 PS:我是小白,欢迎指正,非常感谢! 以下是全文: &q ...
- MySQL数据库基础(一)(启动/停止、登录/退出、语法规范及最基础操作)
1.启动/停止MySQL服务 启动:net start mysql 停止:net stop mysql 2.MySQL登录/退出 登录:mysql 参数:如果连接的是本地服务器,一般用命令:my ...
- 用Eclipse Maven 创建 Web 3.0 项目问题 正确的处理步骤
在Eclipse 安装好Maven插件后,创建Maven webapp项目,在工程 properties -> project facets 界面中将 Dynamic Web Module 修改 ...
- PHP结合Redis来限制用户或者IP某个时间段内访问的次数
$redis = new Redis(); $redis->connect('127.0.0.1', 6379); //获取客户端真实ip地址 function get_real_ip(){ s ...