python3 selenium + fiddler 爬取動態js頁面數據

一、 分析:
抓取動態頁面js加載的人民日報裏面的新聞詳情 https://wap.peopleapp.com/news/1
先打開,然後查看網頁源碼,發現是一堆js,並沒有具體的每個新聞的url詳情,於是第一反應,肯定是js動態加載拼接的url。然後接着按f12 查看,就看url,發現出來了好多url。
然後點擊具體的某一個新聞詳情頁面,查看url,把這個url的 後面兩個數字其中一個拿到訪問主頁的時候,f12 抓包結果裏面去查找,發現一個url,點擊這個url,發現preview裏面有好多數據,我第一反應,肯定是每個新聞數據了。看到這些數據裏面有兩個ID,聯想到剛剛訪問具體新聞詳情頁面也有兩個數字,肯定,具體新聞頁面肯定是 https://wap.peopleapp.com/article 加上兩個ID形成的。於是試了一下拼接一個url訪問,果然是。於是乎只要抓到這個url,就能獲取到每個新聞的詳情頁了。
python3 selenium + fiddler 爬取動態js頁面數據
python3 selenium + fiddler 爬取動態js頁面數據
python3 selenium + fiddler 爬取動態js頁面數據
但這個抓到的url只加載了10條,我於是想改改裏面的 show_num值,發現請求失敗,仔細看這個url,有個securitykey 這個應該是js根據具體算法算出來的,看了一下那個拼接成url的js,發現看着有點頭大,算了,只要我能一直抓這類url就行了
https://app.peopleapp.com/WapApi/610/HomeApi/getContentList?category_id=1&refresh_time=0&show_num=10&page=1&securitykey=ee9bad0d112f882403f5b9f4dc2266a0&interface_code=610

發現只要我頁面往下翻,就會新加載一條,於是我只要能解決兩個問題:
1.往下翻頁的問題,讓這個數據url給加載出來
2.把這個url抓取到日誌裏面利用腳本訪問,就能獲取到數據了

查看了網上一些文檔,最後決定用 python 的 selenium 這個模塊,它是程序打開本地的瀏覽器進行操作,它裏面有個方法execute_script('window.scrollTo(0, document.body.scrollHeight)') 就是下翻頁的,利用這個就能一直把後面的 那個數據url給加載出來了。
第二個就是解決把這個數據url給抓出來,我就用fiddler來進行抓包(這裏抓包工具,根據你們自己的選擇,推薦一個:mitmproxy,這也是抓包神器,可以定製化抓包,比較方便,具體操作請百度、google)
我這裏用fiddler,經常用這個,用着習慣。

二、使用fiddler進行抓包寫入日誌
1.fiddler 導出證書到瀏覽器
1.1.打開 tools-options
python3 selenium + fiddler 爬取動態js頁面數據

1.2.點擊https-> actions -> export root certificate to desktop
python3 selenium + fiddler 爬取動態js頁面數據
1.3.打開瀏覽器(以火狐爲例)

python3 selenium + fiddler 爬取動態js頁面數據
1.4.直接搜索”證書”,點擊查看證書
python3 selenium + fiddler 爬取動態js頁面數據

1.5.點擊導入—選擇剛纔從fiddler導出的證書即可
python3 selenium + fiddler 爬取動態js頁面數據

1.6.設置fiddler代理
打開 tools-> options -> connections
設置端口,默認8888
python3 selenium + fiddler 爬取動態js頁面數據

1.7.設置火狐瀏覽器去連接fiddler代理
找到網絡設置,打開後,點擊手動代理配置,填寫ip,端口,勾選”爲所有協議使用相同的代理服務器”
python3 selenium + fiddler 爬取動態js頁面數據
python3 selenium + fiddler 爬取動態js頁面數據
最後找一個https驗證訪問即可

fiddler 過濾(對動態抓取,可不設置,擴展學習)
參考:
https://www.cnblogs.com/sjl179947253/p/7627250.html

1.8. 打開 FiddlerScript,查找OnBeforeResponse 方法寫入腳本
if (oSession.HostnameIs("app.peopleapp.com") && oSession.uriContains("getContentList")){
var filename = "F:/logs/fiddler.log";
var curDate = new Date();
var logContent = "https://app.peopleapp.com" + oSession.PathAndQuery + "\r\n";
var sw : System.IO.StreamWriter;
if (System.IO.File.Exists(filename)){
sw = System.IO.File.AppendText(filename);
sw.Write(logContent);
}
else{
sw = System.IO.File.CreateText(filename);
sw.Write(logContent);
}
sw.Close();
sw.Dispose();
}

python3 selenium + fiddler 爬取動態js頁面數據
python3 selenium + fiddler 爬取動態js頁面數據

三、 python 腳本讀取fiddler日誌,對最新的url進行獲取內容,提取id拼接成新的新聞詳情url

  1. 準備工作:
    我這裏用的是python3 先pip3 install selenium 安裝模塊

然後下載瀏覽器驅動,這下面有兩個,google根據對應瀏覽器版本下載,firefox根據系統類型下載即可
#google 瀏覽器驅動下載地址 http://npm.taobao.org/mirrors/chromedriver/
#firefox 瀏覽器驅動下載地址 https://github.com/mozilla/geckodriver/releases/

  1. 最後貼上腳本
  2. from selenium import webdriver
    import time
    import requests as r
    import re
    import json

#獲取具體的新聞url,並寫入文本
def get_news_url(search_time):
#打開日誌文件
file = open("F:/logs/fiddler.log","r")
#最新一條url
file_msg = file.readlines()
#判斷fiddler裏面是否有url內容,若讀取的內容列表等於0,則表示無內容
if len(file_msg) == 0:
return "continue"
#讀取數組內容最後一位,即爲最新的url
url = file_msg[-1].strip("\n")
print(url.strip("\n"))
file.close()
headers = {
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,/;q=0.8,application/signed-exchange;v=b3",
"Accept-Encoding": "gzip, deflate, br",
"Accept-Language": "zh-CN,zh;q=0.9",
"Cache-Control": "no-cache",
"Connection": "keep-alive",
"Cookie": "acw_tc=2760826c15644797526864019e11da63f32bf5b082a7da38667809b95819f3; SERVERID=f858eac9d6463aa503ba25948984ceb0|1564566072|1564566072",
"Host": "app.peopleapp.com",
"Pragma": "no-cache",
"Upgrade-Insecure-Requests": "1",
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36"
}
#獲取抓包的最新url數據
html = r.get(url,headers=headers).text
#轉換成json
json_html = json.loads(html)
#獲取json的data數據
news_data_li = json_html["data"]
#寫入文件
news_file = open("F:/logs/news.log","a")
#循環data數據,提取兩個id,拼接成url,寫入日誌文件(這裏可以根據實際情況,如對拼接成的url進行判斷 分成具體的每個月進行寫入日誌等)
for news in news_data_li:
id = news["id"]
articleid = news["articleid"]
news_url = "https://wap.peopleapp.com/article/" + id + "/" + articleid
print(news_url)
news_file.write(news_url + "\n")
news_file.close()
#這一步只是用來控制的獲取數據的時間,若傳入的時間在數據內,則返回stop,停止,比如 只搜索 201904到現在的,就傳入201904即可,這裏根據具體需求改改就行
search_result = re.search(search_time,html)
if search_result is None:
return "continue"
else:
return "stop"

#爬取動態頁面url
#google 瀏覽器驅動下載地址 http://npm.taobao.org/mirrors/chromedriver/
#firefox 瀏覽器驅動下載地址 https://github.com/mozilla/geckodriver/releases/
#browser = webdriver.Chrome(executable_path="D:\python37\chromedriver_win32\chromedriver.exe")
#加載具體的瀏覽器驅動
browser = webdriver.Firefox(executable_path="D:\python37\geckodriver-v0.24.0-win64\geckodriver.exe")
#設置瀏覽器需要訪問的url
browser.get("https://wap.peopleapp.com/news/1")
#循環操作瀏覽器往下翻頁
while True:
#翻頁腳本
browser.execute_script('window.scrollTo(0, document.body.scrollHeight)')
#翻頁後,暫停1秒
time.sleep(1)
#調用獲取具體詳情新聞頁的url
results = get_news_url("201907")
#判斷結果是否停止
if results == "stop":
browser.quit()
break

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章