备案权重域名预定

 找回密碼
 加入我們

記一次基於Cloudflare服務的爬蟲[轉]

[複製鏈接]
老黑醬 發表於 2021-2-5 18:54:45 | 顯示全部樓層 |閱讀模式

開始
相關

目標網站:AVADA – Avada Commerce
使用了Cloudflare的cdn服務,而且Cloudflare又和百度有合作,所以我們的訪問異常時,就會被百度的雲加速服務給攔截下來。

亂碼問題

本來是準備用比較拿手的java寫此次爬蟲,java請求返回的內容總是出現一些亂碼的問題。已經設置為utf-8方式並且像gzip、br等解壓縮都嘗試了,稍微好點的情況只有body標籤內的內容為亂碼,糟糕的情況就是整個返回的內容皆為亂碼。後來就用python試了試,亂碼問題直接沒了,有點迷!

驗證碼問題

之前用python解決亂碼問題後,緊接著又出現的就是訪問需要驗證碼了。當時我是瀏覽器裡訪問不需要驗證碼,但python訪問不管如何,一直出現百度雲加速的驗證碼認證。出現這種情況,我的第一反應是python中是不是少了某些關鍵頭部,於是將瀏覽器中的header帶到python中一 一去試,但並沒有起到啥作用。這裡我就賊納悶了,究竟為甚嗎???後來才突然想起來我瀏覽器走了代理,於是我乾脆給電腦設置了個全局代理,然後用python繼續訪問,讓人感動的一幕發生了-----> 命令行中返回了目標網站的頁面源代碼!這時我才察覺,我的本地IP已經進入了目標網站的黑名單 。到這裡,驗證碼也就繞過了。

JS導致頁面url發生重定向

在把前面的目標網站的頁面下載到本地後,然後用瀏覽器打開該文件,瀏覽器會加載頁面中的一些圖片css還有js等資源文件,其中有個js會檢測當前頁面url中的協議是否是https,如果不是,將重定向至對應的https協議的頁面。這裡顯然,我們打開的本地文件url是文件的目錄,不是以https開始的。
比如火狐瀏覽器中打開目標文件,地址欄的url如下

  1. file:///C:/Users/Asche/vscode/Shopify/temp/Customers/How%20to%20add%20or%20edit%20a%20customer%E2%80%99s%20address.html
複製代碼


被重定向後的url如下

  1. https://c/Users/Asche/vscode/Shopify/temp/Customers/How%20to%20add%20or%20edit%20a%20customer%E2%80%99s%20address.html
複製代碼


顯然,重定向後的頁面是不存在的。當然,我們也可以在頁面重定向前手動取消重定向的請求,不過這樣畢竟體驗不好,所以繼續想辦法解決重定向問題。
於是,準備尋找起重定向作用的·js代碼,瀏覽一番渲染後的頁面源代碼,發現在body標籤結束前,多了這樣一段代碼:

  1. <script type="text/javascript" id="">"https:"!=location.protocol&&(location.href="https:"+window.location.href.substring(window.location.protocol.length));</script>
複製代碼


而且這段代碼在最初的頁面內是沒有的,說明是被別的js動態加載進來的。所以我就選擇其中的一段代碼『location.protocol『,在其餘幾個可疑的js文件內搜索,遺憾的是沒有找到。
另外本來想使用js的debug功能,奈何一到dubug頁面,瀏覽器就未響應!!!
最後沒有辦法,我就直接在目標文件上選擇性的註釋js引入,可疑的js文件都被註釋掉了,卻發現任然存在重定向!!!最後,只剩下一個google相關的js,把那個js註釋掉,重定向終於消失了!那段js代碼大概如下:

  1. <script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
  2. new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
  3. j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
  4. 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
  5. })(window,document,'script','dataLayer','GTM-NPVH4QZ');</script>
複製代碼



本來以為這段代碼就像google分析那樣的一些沒啥影響的Google服務,結果卻讓人有點意外!可能是出於安全的考慮把。
到這裡,重定向也解決!

主要部分Python代碼
  1. import requests
  2. import os
  3. from bs4 import BeautifulSoup

  4. # Author: Asche
  5. # date: 2019年7月6日
  6. print('Shopify start...')

  7. BASE_URL = 'https://avada.io'
  8. headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36',
  9.            'Cookie': '__cfduid=db73a1a3b63a54e86f435f615f5ec37791562300679; _ga=GA1.2.1048718546.1562300686; _gid=GA1.2.312498482.1562300686',
  10.            'Accept': '*/*', 'Accept-Encoding': 'gzip', 'Accept-Language': 'en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7,mt;q=0.6'}


  11. def getHtml(url):
  12.     req = requests.get(url, headers=headers)
  13.     return req.text


  14. def saveFile(name, dir, content):
  15.     folder = os.path.exists(dir)
  16.     if not folder:
  17.         os.mkdir(dir)
  18.     with open( dir + '/' + name.replace('/', '_') + '.html', 'w', encoding='utf-8') as f:
  19.         f.write(content)


  20. def crawlSubpage(url, dir):
  21.         subPage = requests.get(url, headers=headers)
  22.         # print(strHome.headers)

  23.         soup = BeautifulSoup(subPage.content, 'lxml')
  24.         print(soup.title)

  25.         titles = soup.select('div.collection a')
  26.         for title in titles:
  27.             print(title.text, title['href'])
  28.             saveFile(title.text, dir, getHtml(title['href']))


  29. strHome = requests.get(BASE_URL, headers=headers)
  30. # print(strHome.text)
  31. print(strHome.headers)


  32. soup = BeautifulSoup(strHome.content, 'lxml')
  33. # print(soup.prettify)
  34. print(soup.title)

  35. titles = soup.select('h3.header a')
  36. for title in titles:
  37.     print(title.text, title['href'])
  38.     crawlSubpage(title['href'], title.text)
複製代碼

回復

使用道具 舉報

您需要登錄後才可以回帖 登錄 | 加入我們

本版積分規則

备案权重域名预定

點基跨境

GMT+8, 2025-1-23 02:09

By DZ X3.5

QQ

快速回復 返回頂部 返回列表