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

 

 

posted @ 2020-05-26 20:59  xiaoxiaosen  阅读(1296)  评论(0编辑  收藏  举报