本文来源吾爱破解论坛
大佬绕道勿喷,我也是刚学scrapy的小白同学,只是单纯想分享一下成果和学到的技巧 1.png (38.34 KB, 下载次数: 0)
下载附件
保存到相册
首页图集分类
前些天看到一些大佬做的爬虫,爬下了XX网的全部图片,刚好我这段时间也在学scrapy,便有了下面的故事。。。
找别(zi)人(ji)要(zhao)以一个有兴趣的网站,然后对网站进行分析:
分析结果如下:
1. 目的:像大佬那样爬下全部高清大图
2. 网站有对图集进行分类,每个分类下又有单套套图的封面图,想要获取所有高清图片就需要点击封面图进入大图页面,再从大图页面获取高清大图的URL。
(意思就是我们要获取想要的URL就需要进入3层URL 里)
3. 右键从新标签查看图片时发现图片的URL与该图片是当前页面的第几张相对应,故有了通过获取当前页面里,该套图页数对URL里的页码进行遍历,构造新的URL。(具体的看下面的源码,我觉得写的很清楚了)
以上就是大概的思路了,话不多说直接撸代码:
1. spiders下创建一个XXXspider的文件
[Python] 纯文本查看 复制代码
import scrapy #导入scrapy包 class quantuwangSpider(scrapy.Spider): # 定义一个爬虫类 name = 'meinv' # 爬虫名字 start_urls =[ #爬虫开始URL,列表类型 'http://www.quantuwang.co/meinv/' ] custom_settings = { #定义输出等级,以下为进输出错误以上的报错 'LOG_LEVEL': 'ERROR' } def parse(self, response): #parse是关键函数,接收start_urls里的起始url tags = response.css('.index_top_tag a[href^="/meinv/"]::attr(href)').getall() #通过类选择器找到所需要的信息,列表 for tag in tags: tag = "http://www.quantuwang.co" + tag #整合信息 yield scrapy.Request(tag, callback=self.parseIndex) #通过yeild函数传递给下一个函数,callback为整合信息后下一个被调用的函数 print(tag) def parseIndex(self, response): domain = 'http://www.quantuwang.co' pages = response.css('.c_page a::attr(href)').getall() indexs = [] try: # try下的代码会被执行 indexs.append(response.url) if len(pages) is not None: for page in pages: indexs.append(domain + page) except: # except的代码是报错后执行的代码 indexs.append(response.url) for index in indexs: yield scrapy.Request(index, callback=self.parseUrls) #继续传递给下一个函数 def parseUrls(self, response): urls = response.css('.index_left a[href^="/m/"]::attr(href)').getall() for url in urls: url = "http://www.quantuwang.co" + url yield scrapy.Request(url, callback=self.parseImg) def parseImg(self, response): item = QuantuwangItem() #实例化item imgUrl = response.css('.c_img img::attr(src)').get() imgUrl = imgUrl.replace('1.jpg', '') item['imgName'] = response.css('title::text').get() #获取文章标题作为文件夹名字 imgNum = response.css('.c_page a:last-child::text').get() imgUrls = [] #由于采用url拼接的方法,可以把url定于为一个list,再传递给item['imgUrl'] for num in range(int(imgNum)): # print(imgUrl + str(num) + '.jpg') imgUrls.append(imgUrl + str(num) + '.jpg') item['imgUrl'] = imgUrls yield item #yeild出去item
2. 编写item文件(将获取到的数据存为管道文件,便于后期pipelines使用)
[Python] 纯文本查看 复制代码
import scrapy #导入scrapy模块(也可以直接导入scrapy.Item) class QuantuwangItem(scrapy.Item): imgName = scrapy.Field() #获取spider获取的内容(此项为文件名) imgUrl = scrapy.Field() #获取spider获取的内容(此项为图片url) # pass3. 编写pipelines文件(管道文件)
[Python] 纯文本查看 复制代码
from scrapy.pipelines.images import ImagesPipeline #导入图片下载模块 from scrapy import Request import re class QuantuwangPipeline(ImagesPipeline): def get_media_requests(self, item, info): #重写get_media_request方法,定义文件存放目录 for img_url in item['imgUrl']: print(img_url) yield Request(img_url, meta={'name': item['imgName']}) #将目录名(title名)缓存起来,传递给下面的file_path函数 def file_path(self, request, response=None, info=None): image_guid = request.url.split('/')[-1] #对获取到的图片url进行分割,取以'/'的后部分 name = request.meta['name'] name = re.sub(r'[?\\*|“<>:/]', '', name) #过滤windows字符串,避免一些未知错误 filename = u'{0}/{1}'.format(name, image_guid) #对路径/文件的拼接 print(filename) return filename #return文件名
4. setting文件配置(设置scrapy通用配置文件)
#为scrapy提供pipeline文件位置,300表示优先权(1-1000,数字越小,优先权越高)
[Python] 纯文本查看 复制代码
ITEM_PIPELINES = { 'quantuwang.pipelines.QuantuwangPipeline': 300, }
#自定义UA
[Python] 纯文本查看 复制代码
import random USER_AGENT_LIST = [ 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36' "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3", "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; 360SE)", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3", "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3", "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.0 Safari/536.3", "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24", "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24" ] USER_AGENT = random.choice(USER_AGENT_LIST)
#不遵循爬虫协议(即使是robots文件也爬取)
[Python] 纯文本查看 复制代码
ROBOTSTXT_OBEY = False
#定义middlewares模块(不定义的话,可能会遇到302报错)
[Python] 纯文本查看 复制代码
DOWNLOADER_MIDDLEWARES = { 'quantuwang.middlewares.QuantuwangDownloaderMiddleware': 543,#自有 'quantuwang.middlewares.RandomUserAgentMiddleware': 400, #新增,引用middleware里的RandomUserAgentMiddleware类 }
#定义文件下载目录(pipeline定义的是目录,总的下载目录为IMAGES_STORE\PIPELINES定义的目录)
[Python] 纯文本查看 复制代码
IMAGES_STORE = 'D:\\PyCode\\quantuwang'
# 其他方法解决302问题
[Python] 纯文本查看 复制代码
MEDIA_ALLOW_REDIRECTS = True #允许重定向 HTTPERROR_ALLOWED_CODES = [302] #允许302状态码 COOKIES_ENABLED = False #不启用cookie
5. 编写middlewares模块(下载模块,解决该例子302问题)
[Python] 纯文本查看 复制代码
from quantuwang.settings import USER_AGENT_LIST #引用settings里面的UA-list class RandomUserAgentMiddleware(object): def process_request(self, request, spider): rand_use = random.choice(USER_AGENT_LIST) if rand_use: request.headers.setdefault('User-Agent', rand_use)
附上源码:链接: https://pan.baidu.com/s/1vNYISvSd3mvIFnZ2A9UVgA 提取码: 1234
源码
下载积分: 吾爱币 -1 CB
版权声明:
本站所有资源均为站长或网友整理自互联网或站长购买自互联网,站长无法分辨资源版权出自何处,所以不承担任何版权以及其他问题带来的法律责任,如有侵权或者其他问题请联系站长删除!站长QQ754403226 谢谢。
- 上一篇:
- 下一篇: (tkinter自习作)国内股票期权保证金计算器