第二讲案例

开心网个人信息页面爬取

(一)使用登录cookie方法
百度搜索开心网,然后注册账号登录,请勿使用第三方登录,否则无法使用方法二的爬取程序。爬取个人主页内容:http://www.kaixin001.com/set/wap.php
在这里插入图片描述
使用第一讲案例中查找响应文件的方式找到该页面的doc文件,获取请求头中的cookie信息:
在这里插入图片描述
将该信息以键值对的形式存储到请求头参数中即可,请使用自己的cookie值

headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.92 Safari/537.36',
        'Cookie': '......................',
    }

爬取完整程序如下,可参考:

import requests


def local_1():
    # 准备参数
    base_url = 'http://www.kaixin001.com/set/wap.php'
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.92 Safari/537.36',
        'Cookie': '.。。。。。。。',
    }

    # 发送请求获取响应
    response = requests.get(base_url, headers=headers)

    dirname = './HTML/'
    # 写入文件
    with open(f'{dirname}kaixin.html', 'w', encoding='utf-8') as fp:
        fp.write(response.content.decode(encoding='utf-8'))


if __name__ == '__main__':
    local_1()

(二)使用登录账号和密码验证
不太推荐这种方法,因为有的网站需要验证码,会报错。
开心网的登录页面似乎有两个,一个需要验证,一个不需要,这里直接复制这个url即可。https://security.kaixin001.com/login/login_post.php
流程就是创建一个session对象,使用post请求传递了用户账号和密码参数,再使用这个对象对页面进行请求。完整代码如下:

import requests


def local_2():
    """用户名,密码登录爬取"""
    # 1、登录网页
    local_url = 'https://security.kaixin001.com/login/login_post.php'
    base_url = 'http://www.kaixin001.com/set/logo.php'
    # 仅需要浏览器标识
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.92 Safari/537.36',

    }
    data = {
        'email': '填写个人账号',
        'password': '填写密码'
    }
    # 2、创建session对象
    session = requests.Session()
    session.post(local_url, headers=headers, data=data)
    response = session.get(base_url, headers=headers)
    print(response.text)


if __name__ == '__main__':
    local_2()
    

代理ip实践

代理ip可以从网上查找免费版,百度搜索即可。
使用方法很简单,将代理ip使用字典形式传给参数proxies,参考代码如下:

import requests


proxies = {
    'http':'123.169.166.244:9000'
}
response = requests.get('https://www.baidu.com/', proxies=proxies)
print(response.status_code)

高德地图各地区天气

首先同样是通过百度搜索高德地图,f12(笔记本需要Fn+F12),也可通过下图方式打开开发者工具界面:
在这里插入图片描述
首先按照先前的思路查看是否有doc格式的响应文件:
在这里插入图片描述
现在我们考虑是否是AJAX异步请求进行响应,通过观察操作过程的页面变化可以判断:
在这里插入图片描述
这里AJAX异步请求的响应文件为XHR格式,点击查看有我们想要的数据的文件,通过文件的response显示:
在这里插入图片描述
也可以通过preview查看更加美观的数据,点击小三角可以看结构内的数据:
在这里插入图片描述
这样我们已经找到想要的一个响应文件了,然后就是获取这个文件的url:在这里插入图片描述
那么想要每个城市的天气,必不可少的就要获得这个adcode值,因此我们要在响应文件中获取这个adcode一个个找是不太现实的,这里有一个方便的操作,使用常用的ctrll+f进行查找:
首先有一步重要操作,就是需要清理缓存,否则是查找不到的。
在这里插入图片描述
在这里插入图片描述
输入adcode有一系列数据弹出,将鼠标移到每一条数据都有预览框弹出,这里有这么一条数据很明显有我们想要的adcode值对应城市列表:
在这里插入图片描述
然后叉掉搜索框,在工具内查找这条数据的文件名,获取url:
在这里插入图片描述
基本的参数我们都已经拿到了,那么开始写代码:
阅读代码首先看最下面的main程序入口开始,根据调用的函数顺着程序执行的流程阅读。

import requests


def get_json(url):
    """
    根据路由,拿到响应的json数据
    :param url: 获取对象的路由
    :return: json数据
    """
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.92 Safari/537.36',
    }
    response = requests.get(url, headers=headers)
    return response.json()


def get_city_adcode():
    """
    获取城市的adcode
    :return: [(name, adcode)]
    """
    # 发送请求获取响应
    url = 'https://www.amap.com/service/cityList?version='
    city_json = get_json(url)
    # 取出需要的城市的adcode以列表形式保存
    city_list = city_json['data']['cityData']['hotCitys']
    city_adcode = []
    for i in range(1,len(city_list)):
        city_adcode.append((city_list[i]['name'], city_list[i]['adcode']))
    return city_adcode




def get_city_weather(name, adcode):
    """
    获取城市的天气信息
    :param name: 城市名称
    :param adcode: 城市编号
    :return:
    """
    # 发送请求获取天气的json数据
    url = 'https://www.amap.com/service/weather?adcode=%s' % adcode
    weather_json = get_json(url)
    # 获取其中的天气和温度信息
    weather_list = weather_json['data']['data'][0]['forecast_data'][0]
    weather_name = weather_list['weather_name']
    max_temp = weather_list['max_temp']
    min_temp = weather_list['min_temp']
    return f'{name}市,天气:{weather_name},最高温度:{max_temp},最低温度:{min_temp}'


def main():
    """
    获取才是天气的主线任务
    :return:
    """
    # 1、获取城市的adcode
    city_adcode_list = get_city_adcode()
    # 2、获取城市的天气信息
    for city in city_adcode_list:
        name = city[0]
        adcode = city[1]
        get_weather = get_city_weather(name, adcode)
        print(get_weather)



if __name__ == '__main__':
    main()

现阶段比较麻烦的是json数据的结构,怎样轻松快捷的获取到数据内我们想要的内容,这里有一个小技巧:
搜先复制response内的接送数据
在这里插入图片描述
百度搜索json在线格式转换
在这里插入图片描述
将复制的json数据复制到框内,点击格式化和Unicode转中文。
在这里插入图片描述
通过左侧的小三角可以更方便的分析结构。
步骤总结:
在这里插入图片描述

感谢各位耐心浏览!谢谢大家的支持。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值