#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')