抓取异步数据(AJAX)笔记
生活随笔
收集整理的這篇文章主要介紹了
抓取异步数据(AJAX)笔记
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
抓取異步數據(AJAX)
- 數據在XHR中
- 提取結果
- 完整代碼
- 注意事項
數據在XHR中
可以看到,單擊XHR按鈕后,左側的列表只顯示了一個名為data的URL,很明顯,這是獲取數據的路由名字,在右側的Preview選項卡中顯示了data返回的數據,很顯然,這是ISON格式的數字器,其實現在已經完成了任務,找到了異步訪問的 URL, 并且了解了返回的數據格式。那么很多讀者會問,XHR是什么呢?XHR是XMLHupRe quest的縮寫,用于過渡通過異步方式請求的URL,
提取結果
知道了異步請求的URL,就可以通過requests等網絡庫通過URL抓取數據,不過返回的數據格式不是 HTM L,也不是XML,而是 。JSON。所以不能使用XPath和CSS選擇器處理,而是使用json模塊中的loads函數將字符串形式的JSON轉換為Python字典。
result = requests.get('https://...)json_str = result.contentjson_doc = str(json_str,'utf-8')#將結果轉換為JSON對象,這里要先獲得二進制形式,然后用UTF-8轉碼,不能直接用 result.text#屬性,否則有亂碼imageResult = json.loads(json_doc)# 獲取data 的值data = imageResult['data']# 迭代獲取其中的URLfor record in data:url = record.get('middleURL')完整代碼
import requests import json import random import string import osheaders = { 'Host': 'image.baidu.com', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36', 'Cookie': 'ab_sr=1.0.1_MWZjNmQ4NWI0NzM1NTAzMzcxODUzZDhjYjRhNjQwNjJjZDg5MzVmMzliY2VlMzdhZjJlZWRkYTg5YWE0NGQwMmVhNWFkMjgyZWM4NGE2MjI0NzExYTc5ZTRjOGQ3MWM0OWM3ZTVlOTE5NWY5ZmE0OWQxNjJiYWJiYzIwM2EyMjM0ODFlYzY4ODg2NTVmOTBkZDQ5MGYyOGNkNmRiN2FiYQ==' }word = input('請輸入搜索關鍵字: ') print(word)dir_name = ''.join(random.sample(string.ascii_letters+string.digits,8)) print('圖形保存在 ',dir_name,'目錄中')os.mkdir(dir_name)max_value = 100current_index = 0image_index = 1 while current_index< max_value:result = requests.get('https://image.baidu.com/search/detail?ct=503316480&z=0&ipn=false&word={}&step_word=&hs=0&pn={}&spn=0&di=83490&pi=0&rn=1&tn=baiduimagedetail&is=0%2C0&istype=2&ie=utf-8&oe=utf-8&in=&cl=2&lm=-1&st=-1&cs=1026589627%2C4205865473&os=3675895651%2C583397198&simid=3355510967%2C144353084&adpicid=0&lpn=0&ln=1624&fr=&fmq=1629645388047_R&fm=&ic=0&s=undefined&hd=undefined&latest=undefined©right=undefined&se=&sme=&tab=0&width=&height=&face=undefined&ist=&jit=&cg=girl&bdtype=0&oriquery=&objurl=https%3A%2F%2Fss1.baidu.com%2F9vo3dSag_xI4khGko9WTAnF6hhy%2Fzhidao%2Fpic%2Fitem%2Fb03533fa828ba61e591043e94334970a314e597e.jpg&fromurl=ippr_z2C%24qAzdH3FAzdH3Fzit1w5_z%26e3Bkwt17_z%26e3Bv54AzdH3Fq7jfpt5gAzdH3F80ndmcna8d8cnalacb0_z%26e3Bip4s&gsm=96&rpstart=0&rpnum=0&islist=&querylist=&nojc=undefined'.format(word,current_index))json_str = result.contentjson_doc = str(json_str,'utf-8')imageResult = json.loads(json_doc)data = imageResult['data']for record in data:url = record.get('middleURL')if url !=None:print('正在下載圖片:,',url)r = requests.get(url,headers = headers)filename = dir_name+'/'+str(image_index).zfill(10)+".png"with open(filename,'wb') as f:f.write(r.content)image_index +=1current_index +=30print('圖片下載完成')注意事項
- 主頁的代碼是從HXR 的Header中得到的
- 記住要get的headers參數一般都要放Cookie才可以
- allow_redirects=False :是避免重點向過多報錯。
總結
以上是生活随笔為你收集整理的抓取异步数据(AJAX)笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python 创建随机名字的文件夹/文件
- 下一篇: 多线程与多进程爬虫