博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用pyspider爬取巨量淘宝MM图片
阅读量:6039 次
发布时间:2019-06-20

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

版权声明:本文可能为博主原创文章,若标明出处可随便转载。 https://blog.csdn.net/Jailman/article/details/79354568

具体搭建步骤不再赘述,这里主要使用到了fakeagent,phantomjs和proxy

pyspider的爬取相当智能,在不能获取图片的时候会适当的暂停一段时间再试探性的爬取,配合fakeagent,proxypool和phantomjs,爬取成功率在90%以上。
代码是扒的别人的然后修改提高速度和成功率的,数据总量在百G左右,磁盘大的可以扒一扒。

代码如下:

#!/usr/bin/env python# -*- encoding: utf-8 -*-# Created on 2016-03-25 00:59:45# Project: taobaommfrom pyspider.libs.base_handler import *from fake_useragent import UserAgentimport base64import requestsimport randomimport sysreload(sys)sys.setdefaultencoding('UTF-8') PAGE_START = 1PAGE_END = 4301DIR_PATH = '/root/images/tbmm'class Handler(BaseHandler):    r = requests.get(u'http://127.0.0.1:5010/get_all/')    proxy = random.choice(eval(r.text))    ua = UserAgent()    crawl_config = {        "proxy": proxy,        "headers":{            "User-Agent": ua.random        },    }    def __init__(self):        self.base_url = 'https://mm.taobao.com/json/request_top_list.htm?page='        self.page_num = PAGE_START        self.total_num = PAGE_END        self.deal = Deal()    def on_start(self):        while self.page_num <= self.total_num:            url = self.base_url + str(self.page_num)            self.crawl(url, callback=self.index_page)            self.page_num += 1    def index_page(self, response):        for each in response.doc('.lady-name').items():            self.crawl(each.attr.href, callback=self.detail_page, fetch_type='js')    def detail_page(self, response):        domain = response.doc('.mm-p-domain-info li > span').text()        if domain:            page_url = 'https:' + domain            self.crawl(page_url, callback=self.domain_page)    def domain_page(self, response):        name = base64.b64encode(response.doc('.mm-p-model-info-left-top dd > a').text())        dir_path = self.deal.mkDir(name)        brief = response.doc('.mm-aixiu-content').text()        if dir_path:            imgs = response.doc('.mm-aixiu-content img').items()            count = 1            self.deal.saveBrief(brief, dir_path, name)            for img in imgs:                url = img.attr.src                if url:                    extension = self.deal.getExtension(url)                    file_name = name + str(count) + '.' + extension                    count += 1                    self.crawl(img.attr.src, callback=self.save_img,                               save={
'dir_path': dir_path, 'file_name': file_name}) def save_img(self, response): content = response.content dir_path = response.save['dir_path'] file_name = response.save['file_name'] file_path = dir_path + '/' + file_name self.deal.saveImg(content, file_path)import osclass Deal: def __init__(self): self.path = DIR_PATH if not self.path.endswith('/'): self.path = self.path + '/' if not os.path.exists(self.path): os.makedirs(self.path) def mkDir(self, path): path = path.strip() dir_path = self.path + path exists = os.path.exists(dir_path) if not exists: os.makedirs(dir_path) return dir_path else: return dir_path def saveImg(self, content, path): f = open(path, 'wb') f.write(content) f.close() def saveBrief(self, content, dir_path, name): file_name = dir_path + "/" + name + ".txt" f = open(file_name, "w+") f.write(content.encode('utf-8')) def getExtension(self, url): extension = url.split('.')[-1] return extension
你可能感兴趣的文章
表单文件上传与文件下载
查看>>
下午考
查看>>
创建字符设备的三种方法
查看>>
走在网页游戏开发的路上(六)
查看>>
nginx 配置的server_name参数(转)
查看>>
Uva592 Island of Logic
查看>>
C++基础代码--20余种数据结构和算法的实现
查看>>
footer固定在页面底部的实现方法总结
查看>>
nginx上传文件大小
查看>>
数字通信原理笔记(一)---概述
查看>>
HDU 2243 考研路茫茫——单词情结(自动机)
查看>>
Dubbo OPS工具——dubbo-admin & dubbo-monitor
查看>>
Dungeon Master ZOJ 1940【优先队列+广搜】
查看>>
Delphi 中的 XMLDocument 类详解(5) - 获取元素内容
查看>>
2013年7月12日“修复 Migration 测试发现的 Bug”
查看>>
学习vue中遇到的报错,特此记录下来
查看>>
CentOS7 编译安装 Mariadb
查看>>
jstl格式化时间
查看>>
一则关于运算符的小例
查看>>
centos7 ambari2.6.1.5+hdp2.6.4.0 大数据集群安装部署
查看>>