有些日子没写爬虫了 , 今日心血来潮 , 来写写 , 但也不知道爬啥 , 于是随便找了个网站试试手 。
唯美女生
文章插图
一、环境搭建
本爬虫使用Scrapy框架进行爬取
scrapy startproject Weimeicd Weimeiscrapy genspider weimei "weimei.com"
文章插图
修改settings.py文件
文章插图
文章插图
文章插图
设置文件下载路径
文章插图
编写启动文件start.py
from scrapy import cmdlinecmdline.execute("scrapy crawl weimei".split())
二、网页分析今日就先爬个摄影写真吧 , 文章插图
该网页是个典型的瀑布流网页
文章插图
所以我们有两种处理办法
- 使用selenium操控浏览器滑轮 , 然后获取整个页面的源码
- 在网页向下滑动时 , 查看发送的请求 , 根据请求来进行爬取(相当于滑动的效果)
我使用的时第二种可以看到 , 向下滑动 , 浏览器发出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 item
pipelines.pyclass 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# 返回给下一个即将被执行的管道类
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 六堡茶保存方式,六堡茶收藏
- 凯迪拉克运动模式和舒适模式的切换 嘉庆为什么不留着和珅
- 黑茶五种饮用方式,黑茶冲泡方式先容
- 九大安化黑茶功效解析,全国第所黑茶学校安化黑茶学校正式挂牌
- Excel多条件查询,一个万能公式,不理解可以直接套用
- 20款50-500元电脑音箱推荐
- 程序员必备技能:设计模式之——组合模式
- KETTLE 使用教程
- Mybatis-plus常用API全套教程,看完没有不懂的
- CSS样式更改——字体设置Font&边框Border