python爬蟲-動態爬取百度遷徙


#1.模擬瀏覽器發送請求

import requests
import json
import pandas as pd
city_name = []
province_name = []
value = []

url = 'https://huiyan.baidu.com/migration/cityrank.jsonp?dt=country&id=0&type=move_in&date=20200315&callback=jsonp_1590404076900_7186798'

rq = requests.get(url)
rq.status_code

html = rq.content.decode('utf-8')

#2.從html中提取信息
#字符串預處理
html1 = html[28:-1]
data = json.loads(html1)['data']['list']

for i in range(len(data)):
    city_name.append(data[i]['city_name'])   #賦值給一個列表
    province_name.append(data[i]['province_name'])
    value.append(data[i]['value'])
#3.數據的本地存儲
move_in_data = pd.DataFrame({
    '遷入城市':city_name,
    '遷入省份':province_name,
    '比例':value
    })
move_in_data.to_excel('./move_in_data.xlsx')

 

一、分析網站

首先我們來分析網站,動態爬取與靜態爬取有些不同,尋找的數據就不在前端上面找了,而是在加載的文件中尋找

 

 

打開網頁F12,一般我們先看js文件,如果沒有,看看XHR等其他文件。按size排序,從大到小,查找數據

 

 

 

點擊Preview選項,一個個查找,可以看到這里與前端顯示的數據是一樣的,接下來我們就要爬取這個數據

 

二、爬取數據

1、模擬瀏覽器發送數據

import requests

url = 'https://huiyan.baidu.com/migration/cityrank.jsonp?dt=country&id=0&type=move_in&date=20200315&callback=jsonp_1590404076900_7186798'

rq = requests.get(url)
rq.status_code

html = rq.content.decode('utf-8')

當我們查看rq.status_code狀態碼時,返回為200,則說明沒有設置反爬機制,不用設置header,若設置了反爬機制,狀態碼為418,就要像上一篇一樣,設置header

 

 

 

此刻查看html,已經爬取下來了

 

2、提取html中數據

html1 = html[28:-1]
data = json.loads(html1)['data']['list']

for i in range(len(data)):
    city_name.append(data[i]['city_name'])   #賦值給一個列表,.append表示追加
    province_name.append(data[i]['province_name'])
    value.append(data[i]['value'])

 

我們想要的是data里面的數據,那么首先就要截取字典,{}里面的東西

 

 

有一個 方法是直接截取

html1 = html[28:-2]

28是第28位,-2是倒數二位,意思就是只要從48位到-2位之間的內容

 

輸出html1為(注意{}的首位閉合)

 

 

 

 然后進行解析

data = json.loads(html1)

 

json.load(filename)
json.loads(string)
一個從文件加載,一個從內存加載

 

我們想要的是data里面的內容,可以直接

data = json.loads(html1)['data']

 

 

 

 

讀取字典中第一個列表的字段

data['list'][0]['city_name']

 

 

 

3、將數據保存在本地

move_in_data = pd.DataFrame({
    '遷入城市':city_name,
    '遷入省份':province_name,
    '比例':value
    })
move_in_data.to_excel('./move_in_data.xlsx')

 

 


免責聲明!

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



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