zoukankan      html  css  js  c++  java
  • 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')

  • 相关阅读:
    【leetcode】1030. Matrix Cells in Distance Order
    【leetcode】1031. Maximum Sum of Two Non-Overlapping Subarrays
    【leetcode】1032. Stream of Characters
    L120 单词造句
    L119
    L118
    2018.8.6邮件规范一
    L117
    L116
    L115
  • 原文地址:https://www.cnblogs.com/xiaoxiaosen/p/12960617.html
Copyright © 2011-2022 走看看