採用Charles抓取接口數據,而後解析。html
遇到的問題,Charles監聽配置問題python
第一步,分析目標站點mysql
使用安卓模擬器下載抖音短視頻app,下載charles,而且進行配置。sql
www.charlesproxy.com/charles下載地址數據庫
https unknown 問題的解決json
由於https是加密的,Charles須要配置證書才能夠抓包。瀏覽器
安裝證書安全
電腦端網絡
點擊 Help -- SSL Proxying -- Install Charles Root Certificateapp
能夠看到可怕的不信任紅字,系統默認對Charles證書是不信任的,別慌,咱們雙擊Charles證書
點開左邊的信任,選擇始終信任,點關閉,彈出帳戶密碼驗證,填一下就改好了
回到證書列表能夠看到Charles證書已經受信任了
手機端 點擊 Help -- SSL Proxying -- Install Charles Root Certificate on a Mobile Device or Remote Browser
彈出提示,手機wifi網絡配置代理
而後就能夠在手機瀏覽器輸入 chls.pro/ssl 下載證書
證書下載下來是一個 *.pem 的文件,咱們須要重命名爲 *.crt 文件,否則沒法安裝,有的瀏覽器直接下載下來就是 *.crt 文件,看運氣~~ 而後進入手機設置安裝,在此以小米6手機爲例,點擊 設置 -- 更多設置 -- 系統安全 -- 加密與憑據 -- 從存儲設備安裝 找到剛纔瀏覽器下載證書的路徑選擇安裝,爲證書起個名字
點肯定,輸入帳戶密碼完成安裝,回到Charles
能夠看到https連接下終於再也不顯示了,而是感人的數據!
參考:www.cnblogs.com/Zachary46/p…
配置好以後,再次操做app,就能夠看到抓包的數據了。
找到要抓去的數據的url的地址是
aweme-hl.snssdk.com/aweme/v1/ho…
能夠看出,大概是50個一頁,數據以json格式保存。
import requests
import re
import json
import pymysql
def get_page(url):
headers = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'
baseurl = 'https://aweme-hl.snssdk.com/aweme/v1/hotsearch/star/list/?count=50&offset='
url = baseurl + str(url) +'&sort_type=2&type=1'
print(url)
html = requests.get(url= url,verify = False )
print(url)
return html
def parse_page(html):
hjson = json.loads(html.text)
#douyin = re.compile('.*?"followers":(.*),.*?',html.text)
star_list=hjson['star_list']
for i in range(0,50):
followers=star_list[i]['followers']
nickname = star_list[i]['user_info']['nickname']
signature = star_list[i]['user_info']['signature']
uid = star_list[i]['user_info']['uid']
avatar_larger = star_list[i]['user_info']['avatar_larger']['url_list'][0]
print(followers)
print(nickname)
print(signature)
print(uid)
print(avatar_larger)
item = {
'uid':uid,
'nickname' : nickname,
'followers': followers,
'avatar_larger':avatar_larger,
'signature' : signature
}
save_page(item)
def save_page(data):
db = pymysql.connect(host='你的數據庫地址', user='你的用戶名', password='你的密碼', port=3306, db='spider')
cursor = db.cursor()
table = 'douyin'
keys = ', '.join(data.keys())
values = ', '.join(['%s'] * len(data))
sql = 'INSERT INTO {table}({keys}) VALUES ({values}) ON DUPLICATE KEY UPDATE'.format(table=table, keys=keys,
values=values)
update = ','.join([" {key} = %s".format(key=key) for key in data])
sql += update
try:
if cursor.execute(sql, tuple(data.values()) * 2):
print('Successful')
db.commit()
except:
print('Failed')
db.rollback()
db.close()
def main():
for a in range(0,13):
a = a*50
html =get_page(a)
parse_page(html)
main()
複製代碼