保姆式教程带大家爬取高清图片

有些日子没写爬虫了 , 今日心血来潮 , 来写写 , 但也不知道爬啥 , 于是随便找了个网站试试手 。
唯美女生

保姆式教程带大家爬取高清图片

文章插图
 
一、环境搭建
本爬虫使用Scrapy框架进行爬取
scrapy startproject Weimeicd Weimeiscrapy genspider weimei "weimei.com"
保姆式教程带大家爬取高清图片

文章插图
 
修改settings.py文件
保姆式教程带大家爬取高清图片

文章插图
 

保姆式教程带大家爬取高清图片

文章插图
 

保姆式教程带大家爬取高清图片

文章插图
 
设置文件下载路径
保姆式教程带大家爬取高清图片

文章插图
 
编写启动文件start.py
from scrapy import cmdlinecmdline.execute("scrapy crawl weimei".split())二、网页分析今日就先爬个摄影写真吧 , 
保姆式教程带大家爬取高清图片

文章插图
 
该网页是个典型的瀑布流网页
保姆式教程带大家爬取高清图片

文章插图
 
所以我们有两种处理办法
  1. 使用selenium操控浏览器滑轮 , 然后获取整个页面的源码
  2. 在网页向下滑动时 , 查看发送的请求 , 根据请求来进行爬取(相当于滑动的效果)
我使用的时第二种
可以看到 , 向下滑动 , 浏览器发出ajax请求
保姆式教程带大家爬取高清图片

文章插图
 
请求方式为POST
保姆式教程带大家爬取高清图片

文章插图
 
带有参数
保姆式教程带大家爬取高清图片

文章插图
 

保姆式教程带大家爬取高清图片

文章插图
 
可以推断出 , paged相当于页面页数 , 既然如此 , 只要把paged改为1 , 就相当于第一页 , 通过修改paged反复请求可以实现多页爬取
三、代码分析weimei.py
class WeimeiSpider(scrapy.Spider):name = 'weimei'# allowed_domains = ['vmgirls.com']# start_urls = ['https://www.vmgirls.com/photography']#post请求提交的数据 , 可见网页分析data = https://www.isolves.com/it/cxkf/yy/Python/2020-09-09/{"Append": "list - archive","paged": "1",#当前页数"action": "ajax_load_posts","query": "17","page": "cat"} #重写start_requestsdef start_requests(self):#进行多页爬取 , range(3) -> 0 , 1 , 2for i in range(3):#设置爬取的当前页数#range是从0开始self.data["paged"] = str(1 + i)#发起post请求yield scrapy.FormRequest(url="https://www.vmgirls.com/wp-admin/admin-ajax.php", method='POST',formdata=self.data, callback=self.parse)def parse(self, response):#使用BeautifulSoup的lxml库解析bs1 = BeautifulSoup(response.text, "lxml")#图1div_list = bs1.find_all(class_="col-md-4 d-flex")#遍历for div in div_list:a = BeautifulSoup(str(div), "lxml")#参考图2#详情页Urlpage_url = a.find("a")["href"]#每一份摄影写真名称name = a.find("a")["title"]#发送get请求 , 去请求详情页 , 带上name参数yield scrapy.Request(url=page_url,callback=self.page,meta = {"name": name})#详情页爬取def page(self,response):#拿到传过来的name参数name = response.meta.get("name")bs2 = BeautifulSoup(response.text, "lxml")#参考图3img_list = bs2.find(class_="nc-light-gallery").find_all("img")for img in img_list:image = BeautifulSoup(str(img), "lxml")#图4#注意 , 我拿取的时data-src不是src#data-src是html5的新属性 , 意思是数据来源 。#图片urlimg_url = "https://www.vmgirls.com/" + image.find("img")["data-src"]item = WeimeiItem(img_url=img_url, name=name)yield itempipelines.py
class WeimeiPipeline(ImagesPipeline):def get_media_requests(self, item, info):img_url = item["img_url"]name = item["name"]yield scrapy.Request(url=img_url, meta={"name": name})def file_path(self, request, response=None, info=None):name = request.meta["name"]img_name = request.url.split('/')[-1]#拼接路径 , 使每个摄影写真系列的图片都存放于同意文件夹中img_path = os.path.join(name,img_name)# print(img_path)return img_path# 返回文件名def item_completed(self, results, item, info):# print(item)return item# 返回给下一个即将被执行的管道类


推荐阅读