#1.模拟浏览器发送请求
importrequestsimportjsonimportpandas 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 inrange(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、模拟浏览器发送数据
importrequests
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 inrange(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')