博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python使用Scrapy爬虫框架全站爬取图片并保存本地(@妹子图@)
阅读量:6358 次
发布时间:2019-06-23

本文共 6191 字,大约阅读时间需要 20 分钟。

大家可以在Github上clone全部源码。

Github:

Scrapy官方文档:

基本上按照文档的流程走一遍就基本会用了。

 

Step1:

在开始爬取之前,必须创建一个新的Scrapy项目。 进入打算存储代码的目录中,运行下列命令:

scrapy startproject CrawlMeiziTu

该命令将会创建包含下列内容的 tutorial 目录:

CrawlMeiziTu/    scrapy.cfg    CrawlMeiziTu/ __init__.py items.py pipelines.py settings.py      middlewares.py spiders/ __init__.py ... cd CrawlMeiziTu
scrapy genspider Meizitu http://www.meizitu.com/a/list_1_1.html

该命令将会创建包含下列内容的 tutorial 目录:

CrawlMeiziTu/    scrapy.cfg    CrawlMeiziTu/      __init__.py items.py pipelines.py settings.py      middlewares.py spiders/        Meizitu.py __init__.py ...
我们主要编辑的就如下图箭头所示: main.py是后来加上的,加了两条命令,
1 from scrapy import cmdline2 3 cmdline.execute("scrapy crawl Meizitu".split())
主要为了方便运行。 Step2:编辑Settings,如下图所示
1 BOT_NAME = 'CrawlMeiziTu' 2  3 SPIDER_MODULES = ['CrawlMeiziTu.spiders'] 4 NEWSPIDER_MODULE = 'CrawlMeiziTu.spiders' 5 ITEM_PIPELINES = { 6    'CrawlMeiziTu.pipelines.CrawlmeizituPipeline': 300, 7 } 8 IMAGES_STORE = 'D://pic2' 9 DOWNLOAD_DELAY = 0.310 11 USER_AGENT = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'12 ROBOTSTXT_OBEY = True

主要设置USER_AGENT,下载路径,下载延迟时间

Step3:编辑Items. Items主要用来存取通过Spider程序抓取的信息。由于我们爬取妹子图,所以要抓取每张图片的名字,图片的连接,标签等等
# -*- coding: utf-8 -*-# Define here the models for your scraped items## See documentation in:# http://doc.scrapy.org/en/latest/topics/items.htmlimport scrapyclass CrawlmeizituItem(scrapy.Item):    # define the fields for your item here like:    # name = scrapy.Field()    #title为文件夹名字    title = scrapy.Field()    url = scrapy.Field()    tags = scrapy.Field()    #图片的连接    src = scrapy.Field()    #alt为图片名字    alt = scrapy.Field()

 

Step4:编辑Pipelines Pipelines主要对items里面获取的信息进行处理。比如说根据title创建文件夹或者图片的名字,根据图片链接下载图片。
# -*- coding: utf-8 -*-import osimport requestsfrom CrawlMeiziTu.settings import IMAGES_STOREclass CrawlmeizituPipeline(object):    def process_item(self, item, spider):        fold_name = "".join(item['title'])        header = {            'USER-Agent': 'User-Agent:Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36',            'Cookie': 'b963ef2d97e050aaf90fd5fab8e78633',            #需要查看图片的cookie信息,否则下载的图片无法查看        }        images = []        # 所有图片放在一个文件夹下        dir_path = '{}'.format(IMAGES_STORE)        if not os.path.exists(dir_path) and len(item['src']) != 0:            os.mkdir(dir_path)        if len(item['src']) == 0:            with open('..//check.txt', 'a+') as fp:                fp.write("".join(item['title']) + ":" + "".join(item['url']))                fp.write("\n")        for jpg_url, name, num in zip(item['src'], item['alt'],range(0,100)):            file_name = name + str(num)            file_path = '{}//{}'.format(dir_path, file_name)            images.append(file_path)            if os.path.exists(file_path) or os.path.exists(file_name):                continue            with open('{}//{}.jpg'.format(dir_path, file_name), 'wb') as f:                req = requests.get(jpg_url, headers=header)                f.write(req.content)        return item

 

Step5:编辑Meizitu的主程序。 最重要的主程序:
# -*- coding: utf-8 -*-import scrapyfrom CrawlMeiziTu.items import CrawlmeizituItem#from CrawlMeiziTu.items import CrawlmeizituItemPageimport timeclass MeizituSpider(scrapy.Spider):    name = "Meizitu"    #allowed_domains = ["meizitu.com/"]    start_urls = []    last_url = []    with open('..//url.txt', 'r') as fp:        crawl_urls = fp.readlines()        for start_url in crawl_urls:            last_url.append(start_url.strip('\n'))    start_urls.append("".join(last_url[-1]))    def parse(self, response):        selector = scrapy.Selector(response)        #item = CrawlmeizituItemPage()        next_pages = selector.xpath('//*[@id="wp_page_numbers"]/ul/li/a/@href').extract()        next_pages_text = selector.xpath('//*[@id="wp_page_numbers"]/ul/li/a/text()').extract()        all_urls = []        if '下一页' in next_pages_text:            next_url = "http://www.meizitu.com/a/{}".format(next_pages[-2])            with open('..//url.txt', 'a+') as fp:                fp.write('\n')                fp.write(next_url)                fp.write("\n")            request = scrapy.http.Request(next_url, callback=self.parse)            time.sleep(2)            yield request        all_info = selector.xpath('//h3[@class="tit"]/a')        #读取每个图片夹的连接        for info in all_info:            links = info.xpath('//h3[@class="tit"]/a/@href').extract()        for link in links:            request = scrapy.http.Request(link, callback=self.parse_item)            time.sleep(1)            yield request        # next_link = selector.xpath('//*[@id="wp_page_numbers"]/ul/li/a/@href').extract()        # next_link_text = selector.xpath('//*[@id="wp_page_numbers"]/ul/li/a/text()').extract()        # if '下一页' in next_link_text:        #     nextPage = "http://www.meizitu.com/a/{}".format(next_link[-2])        #     item['page_url'] = nextPage        #     yield item            #抓取每个文件夹的信息    def parse_item(self, response):         item = CrawlmeizituItem()         selector = scrapy.Selector(response)         image_title = selector.xpath('//h2/a/text()').extract()         image_url = selector.xpath('//h2/a/@href').extract()         image_tags = selector.xpath('//div[@class="metaRight"]/p/text()').extract()         if selector.xpath('//*[@id="picture"]/p/img/@src').extract():            image_src = selector.xpath('//*[@id="picture"]/p/img/@src').extract()         else:            image_src = selector.xpath('//*[@id="maincontent"]/div/p/img/@src').extract()         if selector.xpath('//*[@id="picture"]/p/img/@alt').extract():             pic_name = selector.xpath('//*[@id="picture"]/p/img/@alt').extract()         else:            pic_name = selector.xpath('//*[@id="maincontent"]/div/p/img/@alt').extract()         #//*[@id="maincontent"]/div/p/img/@alt         item['title'] = image_title         item['url'] = image_url         item['tags'] = image_tags         item['src'] = image_src         item['alt'] = pic_name         print(item)         time.sleep(1)         yield item

 

 

转载于:https://www.cnblogs.com/william126/p/6923017.html

你可能感兴趣的文章
思科表态反对网络中立
查看>>
《HTML5+CSS3网页设计入门必读》——1.5 利用多种Web浏览器执行测试
查看>>
Velocity官方指南-容器
查看>>
国家为何如此重视石墨烯?
查看>>
《Python和Pygame游戏开发指南》——1.14 配套网站上的更多信息
查看>>
利用mybatis查询两级树形菜单
查看>>
《慕客网:IOS基础入门之Foundation框架初体验》学习笔记 <一>
查看>>
Spring声明式事务管理之二:核心接口API
查看>>
LNMP环境安装(二)
查看>>
MFC对话框编程-图片控件
查看>>
nodejs启动webserver服务
查看>>
小偷被抓叫嚣:我不偷警察没饭吃
查看>>
python初学—-实现excel里面读数据进行排序
查看>>
用户体验升级后 “谁行谁上”让百度Q4财报更有底气
查看>>
直播相关学习链接
查看>>
使用RPM包工具和源码包编译安装Linux应用程序
查看>>
VoIP——开启免费通话新时代的先锋
查看>>
Linux下rsync的用法
查看>>
apache虚拟主机、日志轮询、日志统计、去版本优化
查看>>
java代码实现开启openoffice服务和关闭sffice.exe进程
查看>>