开心网个人信息页面爬取
(一)使用登录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转中文。
通过左侧的小三角可以更方便的分析结构。
步骤总结:
感谢各位耐心浏览!谢谢大家的支持。