国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

!ta竟然用Node.js對這些beauty圖做了這些事。。。

mayaohua / 2794人閱讀

摘要:做了什么一個用于爬取上妹子圖片的爬蟲。于是觀察瀏覽器正常瀏覽行為。在請求頭中設置和。解決該問題斷線繼續下載圖片下載個文件時,經常斷線。應該是網站的飯爬蟲機制起了作用,暫時無法解決。于是在保存圖片時會先判斷圖片是否存在。

做了什么

一個用于爬取www.nvshens.com上妹子圖片的爬蟲。如有侵權,馬上關閉

原因

一張張下實在太麻煩了

如何使用

</>復制代碼

  1. 0. node -v >= 7.6
  2. 1. git clone https://github.com/laihaibo/beauty-spider.git
  3. 2. npm i
  4. 3. npm run start (爬取相冊圖片鏈接,并保存為json)
  5. 4. npm run calc (獲取爬取的相冊數和文件數)
  6. 5. npm run download (下載圖片文件)
update against反爬蟲

圖片下載完之后會發現變成了盜鏈圖片。于是觀察瀏覽器正常瀏覽行為。在請求頭中設置referer, acceptuser-agent。解決該問題

</>復制代碼

  1. request.get(url).set({
  2. "Referer": "https://www.google.com",
  3. "Accept": "image/webp,image/*,*/*;q=0.8",
  4. "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3091.0 Safari/537.36"
  5. }).end((err, res) => {})
斷線繼續下載

圖片下載700個文件時,經常斷線。應該是網站的飯爬蟲機制起了作用,暫時無法解決。重新下載時理應跳過已經下載的文件。于是在保存圖片時會先判斷圖片是否存在。

</>復制代碼

  1. let isExit = fs.existsSync(path);
  2. if (!isExit) {
  3. saveOne(...args)
  4. }
獲取理應下載的相冊數和文件數

</>復制代碼

  1. let data = JSON.parse(fs.readFileSync(path));
  2. let count = data.reduce((prev, cur) => prev + cur.imgList.length, 0);
  3. console.log(`共${data.length}個相冊,共${count}張圖片`);
步驟

引入所需的庫

</>復制代碼

  1. const fs = require("fs");
  2. const mkdirp = require("mkdirp");
  3. const cheerio = require("cheerio");
  4. const request = require("superagent");
  5. require("superagent-charset")(request);

頁面分析,配置config文件
分析相冊地址,以韓國這個標簽為例,首頁為https://www.nvshens.com/gallery/hanguo/, 第二頁為https://www.nvshens.com/gallery/hanguo/2.html

</>復制代碼

  1. const config = {
  2. current: "hanguo",
  3. allTags: {
  4. rougan: `https://www.nvshens.com/gallery/rougan/`,
  5. hanguo: "https://www.nvshens.com/gallery/hanguo/"
  6. }
  7. }

封裝獲取指定url的html內容函數

</>復制代碼

  1. //該網站編碼為utf-8
  2. const getHtml = url => {
  3. return new Promise((resolve, reject) => {
  4. request.get(url).charset("utf-8").end((err, res) => {
  5. err ? reject(err) : resolve(cheerio.load(res.text));
  6. })
  7. })
  8. }

獲取本分類下所有相冊的標簽

</>復制代碼

  1. /**
  2. * @param {string} startUrl 標簽首頁的url地址
  3. */
  4. const getAlbums = (startUrl) => {
  5. return new Promise((resolve, reject) => {
  6. let albums = []; // 用于保存該標簽的所有相冊信息
  7. let getQuery = async startUrl => {
  8. try {
  9. let $ = await getHtml(startUrl);
  10. let pages = $("#listdiv .pagesYY a").length; // 獲取頁數
  11. for (let i = 1; i <= pages; i++) {
  12. let pageUrl = `${startUrl + i}.html` // 設置每頁的url
  13. let $ = await getHtml(pageUrl);
  14. // 動態設置pages的值
  15. let compare = $("#listdiv .pagesYY a").map(function (i, el) {
  16. return parseInt($(this).text(), 0);
  17. }).get().filter(x => x > 0);
  18. pages = conmpare.length < 2 ? pages : compare.reduce((prev, cur) => Math.max(prev, cur));
  19. $(".galleryli_title a").each(function () {
  20. albums.push({
  21. title: $(this).text(),
  22. url: `https://www.nvshens.com${$(this).attr("href")}`,
  23. imgList: [],
  24. id: parseInt($(this).attr("href").split("/")[2], 10)
  25. })
  26. })
  27. }
  28. resolve(albums); // 返回相冊信息
  29. } catch (error) {
  30. console.log(error);
  31. }
  32. }
  33. getQuery(startUrl);
  34. })
  35. }

獲取所有相冊的圖片信息

</>復制代碼

  1. /**
  2. * @param {string} startUrl 該相冊首頁的url地址
  3. */
  4. const getImgList = (startUrl) => {
  5. return new Promise((resolve, reject) => {
  6. let albums = []; // 存儲本相冊的所有圖片信息
  7. let getQuery = async startUrl => {
  8. try {
  9. let $ = await getHtml(startUrl);
  10. let pages = $("#pages a").length;
  11. for (let i = 1; i <= pages; i++) {
  12. let pageUrl = `${startUrl + i}.html`
  13. let $ = await getHtml(pageUrl);
  14. $("#hgallery img").each(function () {
  15. let url = $(this).attr("src"); //圖片地址
  16. let fileName = url.split("/").pop(); //文件名
  17. let id = parseInt(fileName.split(".")[0], 10); //id
  18. albums.push({
  19. url,
  20. fileName,
  21. id
  22. })
  23. })
  24. }
  25. resolve(albums); // 返回本相冊的所有圖片信息
  26. } catch (error) {
  27. console.log(error);
  28. }
  29. }
  30. getQuery(startUrl);
  31. })
  32. }

保存相冊信息

</>復制代碼

  1. /**
  2. * @param {string} path 保存數據的路徑
  3. * @param {array} albums 相冊信息數組
  4. */
  5. const saveData = (path, albums) => {
  6. fs.writeFile(path, JSON.stringify(albums, null, " "), function (err) {
  7. err ? console.log(err) : console.log("Data saved");
  8. });
  9. }

保存圖片

</>復制代碼

  1. /**
  2. 12. @param {string} title 圖片所在文件夾名
  3. 13. @param {string} url 圖片url
  4. 14. @param {string} fileName 圖片名
  5. 15. @param {array} imgList 單個相冊的圖片信息
  6. */
  7. // 保存一張圖片
  8. const saveOne = (title, url, fileName) => {
  9. return new Promise((resolve, reject) => {
  10. let path = `./img/${currentImgType}/${title}/${fileName}`;
  11. request.get(url).end((err, res) => {
  12. if (err) {
  13. console.log(`Error: ${err} in getting ${url}`)
  14. }
  15. fs.writeFile(path, res.body, function (err) {
  16. if (err) console.log(`Error: ${err} in downloading ${url}`)
  17. });
  18. resolve();
  19. })
  20. })
  21. }
  22. //保存一個相冊下的多張圖片
  23. const saveImg = ({title,imgList}) => {
  24. // 創建文件夾
  25. mkdirp(`./img/${currentImgType}/${title}`, function (err) {
  26. if (err) {
  27. console.log(`Error: ${err} in makedir ${title}`);
  28. }
  29. });
  30. let getQuery = async() => {
  31. try {
  32. for (let {url,fileName} of imgList) {
  33. await saveOne(title, url, fileName);
  34. }
  35. } catch (error) {
  36. console.log(error);
  37. }
  38. }
  39. // 打印下載一個相冊所需時間
  40. console.time(`download ${title}...`)
  41. getQuery();
  42. console.timeEnd(`download ${title}...`)
  43. }

執行爬蟲

</>復制代碼

  1. const doSpider = async() => {
  2. try {
  3. // 獲取相冊信息
  4. let albums = await getAlbums(allTags[current]);
  5. // 獲取每張圖片信息
  6. for (let album of albums) {
  7. let imgList = await getImgList(album.url);
  8. album.imgList = imgList;
  9. }
  10. // 保存json
  11. let jsonPath = `./data`;
  12. mkdirp(jsonPath, function (err) {
  13. if (err) {
  14. console.log(`Error: ${err} in makedir of Json`);
  15. }
  16. });
  17. saveData(`${jsonPath}/${currentImgType}.json`, albums);
  18. // 保存圖片
  19. for (let value of albums) {
  20. saveImg(value)
  21. }
  22. } catch (error) {
  23. console.log(error);
  24. }
  25. }

心得體會

有些坑如果不踩過一遍是不會吐血的,比如cheerio的操作和fs的操作

just do it

感謝

本文有參考nieheyong的HanhandeSpider和其他的爬蟲文章,得到很多啟發

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/84186.html

相關文章

  • 谷歌3億張做了個深度學習實驗,結論:數據還是越大越好

    摘要:然而,可用數據集的規模卻沒有成比例地擴大。這還說明無監督表征學習,以及半監督表征學習方法有良好的前景。例如,對于對象探測得分,單個模型目前可以實現,高于此前的。此外,構建包含圖片的數據集并不是最終目標。 都說深度學習的興起和大數據息息相關,那么是不是數據集越大,訓練出的圖像識別算法準確率就越高呢?Google的研究人員用3億張圖的內部數據集做了實驗,然后寫了篇論文。他們指出,在深度模型中,視...

    twohappy 評論0 收藏0
  • 前端每周清單:Node.js 微服務實踐,Vue.js 與 GraphQL,Angular 組件技巧

    摘要:前端每周清單第期微服務實踐,與,組件技巧,攻防作者王下邀月熊編輯徐川前端每周清單專注前端領域內容,以對外文資料的搜集為主,幫助開發者了解一周前端熱點分為新聞熱點開發教程工程實踐深度閱讀開源項目巔峰人生等欄目。 前端每周清單第 26 期:Node.js 微服務實踐,Vue.js 與 GraphQL,Angular 組件技巧,HeadlessChrome 攻防 作者:王下邀月熊 編輯:徐川...

    wall2flower 評論0 收藏0
  • 淺析webpack源碼之convert-argv模塊(二)

    摘要:接下來我看看一下函數我們先按照分支走為讀取是里的對象,饒了這大的一個圈子,那么接下來一起來看一看對你的輸入配置做了怎么樣的處理吧 打開webpeck-cli下的convert-argv.js文件 // 定義options為空數組 const options = []; // webpack -d 檢查 -d指令 if (argv.d) { //... } ...

    lemon 評論0 收藏0
  • 精讀《深入淺出Node.js

    摘要:從社區和過往的經驗而言異步編程的難題已經基本解決無論是通過事件還是通過模式或者流程控制庫。本章主要介紹了主流的幾種異步編程解決方案這是目前中主要使用的方案。最后因為人們總是習慣性地以線性的方式進行思考以致異步編程相對較為難以掌握。 前言 如果你想要深入學習Node,那你不能錯過《深入淺出Node.js》這本書,它從不同的視角介紹了 Node 內在的特點和結構。由首章Node 介紹為索引...

    codergarden 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<