數據加載方式與實例操作


數據的加載方式

常見的加載方式

朝服務器發送請求,頁面數據直接全部返回並加載。

 

如何驗證數據是直接加載還是其他方式

瀏覽器空白處鼠標右鍵,點擊查看網頁源碼,在源碼界面搜索對應的數據。

如果能收到就表示該數據是直接加載的,可以直接發送相應的請求獲取。

 

內部js代碼請求

先加載一個頁面的框架,之后再朝各項數據的網址發送請求獲取數據。

 

如何查找關鍵性的數據來源

需要借助於瀏覽器的network監測核對內部請求

請求的數據一般都是json格式

 

實例

爬取天氣數據

思路

1.拿到頁面之后先分析數據加載方式

2.發現歷史數據並不是直接加載的

統一的研究方向>>>:利用network查看

3.查找到可疑的網址並查看請求方式

如果是get請求那么可以直接拷貝網址在瀏覽器地址欄訪問

4.將請求獲得的數據稍作分析

https://www.bejson.com/

5.利用requests模塊朝發現的地址發送get請求獲取json數據

6.可以研究歷史天氣數據的url找規律 即可爬取指定月份的數據

 

 

 

import requests
import pandas
res = requests.get('https://tianqi.2345.com/Pc/GetHistory?areaInfo%5BareaId%5D=60010&areaInfo%5BareaType%5D=2&date%5Byear%5D=2021&date%5Bmonth%5D=9')
real_data = res.json().get('data')

df2 = pandas.read_html(real_data)[0]
print(df2)

  

 

百度翻譯

思路

1.在查找單詞的時候頁面是在動態變化的

2.並且針對單詞的詳細翻譯結果數據是動態請求獲取的

3.打開network之后輸入英文查看內部請求變化

sug請求頻率固定且較高

4.研究sug請求發現每次輸入的單詞都會朝固定的一個網址發送post請求

並且請求體攜帶了改單詞數據

 

 

 

 

 

 

import requests

keyword = input('請輸入你需要查詢的單詞>>>:')
res = requests.post('https://fanyi.baidu.com/sug',
                    data={'kw': keyword}
                    )
data_dict = res.json()
data_list = data_dict.get('data')
for d in data_list:
    print(d)

  

 

爬取葯品許可證

思路

1.先明確是否需要爬取頁面數據 如果需要則先查看數據的加載方式

2.通過network查看得知數據是動態加載的 網頁地址只會加載一個外殼

3.通過network點擊fetch/xhr篩選動態獲取數據的地址和請求方式

4.利用requests模塊發送相應請求獲取數據 之后再分析

5.利用瀏覽器點擊詳情頁查找關鍵數據

http://scxk.nmpa.gov.cn:81/xk/itownet/portal/dzpz.jsp?id=911d4f256300476abb78012427d38c9d

6.由於我們需要爬取詳情頁的數據所以要驗證數據的加載方式

7.詳情頁核心數據也是動態加載的 發現是post請求並攜帶了一個id參數

id: 911d4f256300476abb78012427d38c9d

8.通過比對得知id數據與第一次爬取的公司簡介里面的id一致 從而得出結論

循環獲取格式簡介id 然后發送post請求 獲取每個公司的詳細數據

 

 

 

 

 

 

import requests

res = requests.post('http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsList',
                    data={
                        "on": "true",
                        "page": 1,
                        "pageSize": 15,
                        "productName": '',
                        "conditionType": 1,
                        "applyname": '',
                        "applysn": ''
                    }
                    )
data_list = res.json().get('list')  # 循環獲取格式id值
for d in data_list:
    # 字段取值 獲取id值
    ID = d.get("ID")
    # 發送網絡請求
    res1 = requests.post('http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsById',
                         data={'id': ID}
                         )

    # 獲取數據結果
    data_dict = res1.json().get('epsName')
    data_dict2 = res1.json().get('certStr')
    data_dict3 = res1.json().get('epsAddress')
    data_con = data_dict + '\n' + data_dict2 + '\n' + data_dict3 + '\n'
    with open(r'medicine.txt', 'a', encoding='utf8')as af:
        af.write(data_con + '\n')

  

 

爬取北京新發地蔬菜價格表

思路:

1.確定需要訪問網址:http://www.xinfadi.com.cn/priceDetail.html

2.右鍵選擇‘查看網頁源代碼’,ctrl+f搜索,觀察數據是否是直接放在網頁中的

本次數據並未放在網頁中

3.右鍵選擇‘檢查’,根據network,可以確認數據是動態加載的,選擇Fetch/XHR,篩選出對應的文件

4.單擊該文件,查看對應的是get還是post方法,以及對應的From Data數據

 

5.選擇Response,將內容復制到:https://www.bejson.com/,點擊Unicode轉中文,查看數據存放的具體位置

本次數據存放在字典中,鍵名是“list”,數據格式是json格式

6.打開pycharm,新建文件夾及文件,導入requests模塊

7.使用post-data方法,反序列化並使用get方法從字典中獲取數據

8.循環取值,獲得數據

9.根據自身的需要,用鍵名取得需要的值

10.將獲取的數據寫入文件

import requests
import time

def get_price_data(n):
    res = requests.post('http://www.xinfadi.com.cn/getPriceData.html',
                        data={
                            "limit": '',
                            "current": n,
                            "pubDateStartTime": '',
                            "pubDateEndTime": '',
                            "prodPcatid": '',
                            "prodCatid": '',
                            "prodName": '',
                        }
                        )
    data_list = res.json().get('list')
    for d in data_list:
        pro_name = d.get('prodName')
        low_price = d.get('lowPrice')
        high_price = d.get('highPrice')
        avg_price = d.get('avgPrice')
        pub_date = d.get('pubDate')
        source_place = d.get('place')
        print("""
        蔬菜名稱:%s
        最低價:%s
        最高價:%s
        平均價:%s
        上市時間:%s
        原產地:%s
        """ % (pro_name, low_price, high_price, avg_price, pub_date, source_place))
        time.sleep(1)


"""涉及到多頁數據爬取的時候 最好不要太頻繁 可以自己主動設置延遲"""
for i in range(1, 5):
    time.sleep(1)
    get_price_data(i)

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM