Python+Scrapy批量抓取唯一图库图片并按系列存储

  • A+
所属分类:Python

Python+Scrapy批量抓取唯一图库图片并按系列存储 - 极墨 - CSDN博客

Python+Scrapy批量抓取唯一图库图片并按系列存储

开发及运行环境

CentOS Linux release 7.4.1708 +  Pycharm2018.1.3
Python 2.7.5 + Scrapy 1.5.0
如何安装开发环境和运行环境这里就不赘述了,Scrapy是个很强大的框架,本例只使用了其中部分功能。

干货

爬取网站为唯一图库,http://www.mmonly.cc/mmtp/
源代码托管:github

MMspider.py

爬虫主解析程序,关于网站源码解析以及XPATH语法,请自行百度,或者留言
1.

--coding:utf-8--

2.
import os
3.
import scrapy
4.
import datetime
5.
from scrapy.linkextractors import LinkExtractor
6.
from scrapy.spiders import CrawlSpider, Rule
7.
from mmonly.items import mmonlyItem
8.

9.
class Myspider(CrawlSpider):
10.
name = 'mmspider'
11.
base = r'/home/yinchong/Downloads/mmtp/' # 定义基础存储路径
12.

13.
allowed_domains = ['mmonly.cc']
14.
start_urls = [
15.
'http://www.mmonly.cc/mmtp/',
16.
]
17.
    # 定义主页面爬取规则,有下一页则继续深挖,其他符合条件的链接则调用parse_item解析原图地址
18.
rules = (
19.

Rule(LinkExtractor(allow=(''), restrict_xpaths=(u"//a[contains(text(),'下一页')]")), follow=True),

20.

Rule(LinkExtractor(allow=('http://www.mmonly.cc/(.*?).html'), restrict_xpaths=(u"//div[@class='ABox']")), callback="parse_item", follow=False),

21.
)
22.

23.
def parse_item(self, response):
24.
item = mmonlyItem()
25.
item['siteURL'] = response.url
26.
item['title'] = response.xpath('//h1/text()').extract_first() # xpath解析标题
27.
item['path'] = self.base + item['title'] # 定义存储路径,同一系列存储在同一目录
28.
path = item['path']
29.
if not os.path.exists(path):
30.
os.makedirs(path) # 如果存储路径不存在则创建
31.

item['detailURL'] = response.xpath('//a[@class="down-btn"]/@href').extract_first() # 解析原图URL

32.
print(item['detailURL'] )
33.

num = response.xpath('//span[@class="nowpage"]/text()').extract_first() # 解析同一系列图片编号

34.
item['fileName'] = item['path'] + '/' + str(num) + '.jpg' # 拼接图片名称
35.

36.

print datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'), item['fileName'], u'解析成功!'

37.
yield item
38.
        # 传入的解析item的链接如果有下一页的话,继续调用parse_item
39.

next_page = response.xpath(u"//a[contains(text(),'下一页')]/@href").extract_first()

40.
if next_page is not None:
41.
next_page = response.urljoin(next_page)
42.
yield scrapy.Request(next_page, callback=self.parse_item)

items.py

1.

-- coding: utf-8 --

2.
import scrapy
3.

4.
class mmonlyItem(scrapy.Item):
5.
siteURL = scrapy.Field() # 图片网站地址
6.
detailURL = scrapy.Field() # 图片原图地址
7.
title = scrapy.Field() # 图片系列名称
8.
fileName = scrapy.Field() # 图片存储全路径名称
9.
path = scrapy.Field() # 图片系列存储路径

pipelines.py

下载处理程序
1.

-- coding: utf-8 --

2.
import requests
3.
import datetime
4.

5.
class mmonlyPipeline(object):
6.
def process_item(self, item, spider):
7.
count = 0
8.
detailURL = item['detailURL']
9.
fileName = item['fileName']
10.
while True:
11.
try:
12.

print datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'), u'正在保存图片:', detailURL

13.
print u'文件:', fileName
14.
image = requests.get(detailURL) # 根据解析出的item原图链接下载图片
15.
f = open(fileName, 'wb') # 打开图片
16.
f.write(image.content) # 写入图片
17.
f.close()
18.
except Exception, e:
19.
print fileName, 'other fault:', e
20.
count += 1
21.
else:
22.
print datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'), fileName, u'保存成功!'
23.
break
24.
return item

settings.py

scrapy设置,由于本次采集的网站反爬不严大笑,未使用随机User-Agent和IP代理。

1.

-- coding: utf-8 --

2.

Scrapy settings for mmonly project

3.

4.
BOT_NAME = 'mmonly'
5.
SPIDER_MODULES = ['mmonly.spiders']
6.
NEWSPIDER_MODULE = 'mmonly.spiders'
7.
FEED_EXPORT_ENCODING = 'utf-8'
8.

9.
ROBOTSTXT_OBEY = False
10.

默认是16,一次可以请求的最大次数

11.
CONCURRENT_REQUESTS = 32
12.

下载延迟

13.

DOWNLOAD_DELAY = 0.1

14.
COOKIES_ENABLED = False
15.
DEFAULT_REQUEST_HEADERS = {
16.

'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,/;q=0.8',

17.
'Accept-Encoding':'gzip, deflate, sdch',
18.
'Accept-Language':'zh-CN,zh;q=0.8',
19.
'Cache-Control':'max-age=0',
20.
'Connection':'keep-alive',
21.

'User-Agent':'Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36'}

22.

23.
ITEM_PIPELINES = {'mmonly.pipelines.mmonlyPipeline': 100}
24.

日志级别

25.
LOG_LEVEL = 'INFO'
26.
LOG_FILE = '/tmp/log.txt'

main.py

1.
from scrapy.cmdline import execute
2.
execute(['scrapy', 'crawl', 'mmspider'])
命令行运行scrapy crawl mmspider或者 python main.py
Pycharm运行main.py

运行效果

运行main.py开始抓取图片,总计抓取图片超过20万张大笑,运行时间会很长,需要的磁盘空间也很大,做好心理准备。如果您有好的多线程方案,可以留言讨论。

5d6617adc194b2004d000014_html_.png

  • 我的微信
  • 这是我的微信扫一扫
  • weinxin
  • 我的微信公众号
  • 我的微信公众号扫一扫
  • weinxin