python 爬虫系列02 认识 requests

来源:互联网 发布:淘宝搜索结果不对 编辑:程序博客网 时间:2024/06/07 01:51

本系列所有文章基于 python3.5.2

requests 是基于 urllib 的三方模块,相比于 uillib, 操作更简洁,功能更强大,而且支持 python3

GET

直接调用 get 方法请求百度贴吧首页

import requestsr = requests.get(url='https://tieba.baidu.com/f')print(r.status_code)print(r.text)

得到如下结果:

200...<!--STATUS OK--><html><head><meta name="keywords" content="贴吧,,百度贴吧,论坛,兴趣,社区,BBS"/><meta name="description" content="百度贴吧——全球最大的中文社区。...

带参数的 get 请求,这里请求李毅吧的首页

import requestsparams = {'kw': '李毅'.encode('utf-8'),'fr':'ala0','tpl':'5'}r = requests.get(url='https://tieba.baidu.com/f', params=params)print(r.status_code)print(r.text)

得到如下结果:

200...<meta charset="UTF-8"><meta name="keywords" content="李毅,网友俱乐部,贴吧,三百六十行,神武">...

POST

post 方法与 get 类似,直接调用即可

r = requests.post(url='https://tieba.baidu.com/f', params=params)

如果 post 上传数据,数据转换为 bytes 放在 data 字段即可

import requestsimport jsonupload_url = '***'r = requests.post(upload_url, data=json.dumps({'some': 'data'}))

Headers

加上 HTTP 请求头也很简单,只需把各个参数作为写入 dict 传给 headers 参数即可
下面模拟浏览器请求中国天气网数据

import requestsurl = 'http://www.weather.com.cn/weather/101010100.shtml'header = {    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',    'Accept-Encoding': 'gzip, deflate, sdch',    'Accept-Language': 'zh-CN,zh;q=0.8',    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.104 Safari/537.36 Core/1.53.3226.400 QQBrowser/9.6.11681.400'}req = requests.get(url, headers=header)req.encoding = 'utf-8' # 防止乱码print(req.status_code)print(req.text)

得到如下 HTTP 响应:

200...<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><title>【北京天气】北京天气预报,蓝天,蓝天预报,雾霾,雾霾消散,天气预报一周,天气预报15天查询</title>...

异常, JSON 解码

URL = 'http://ip.taobao.com/service/getIpInfo.php'  # 淘宝IP地址库APItry:    r = requests.get(URL, params={'ip': '49.4.168.222'}, timeout=5)    r.raise_for_status()    # 如果响应状态码不是 200,就主动抛出异常except requests.RequestException as e:    print(e)else:    result = r.json() # Requests中内置的JSON解码器    print(type(result), result, sep='\n')

得到结果:

{'code': 0, 'data': {'region_id': '110000', 'isp_id': '100017', 'county': '', 'city_id': '110100', 'region': '北京市', 'area_id': '100000', 'country_id': 'CN', 'city': '北京市', 'country': '中国', 'area': '华北', 'county_id': '-1', 'ip': '49.4.168.222', 'isp': '电信'}}

cookies

如果某个响应中包含 cookie ,可以快速的访问他们

import requestsr = requests.get('http://www.baidu.com', timeout=5)print(tuple(r.cookies))

得到如下结果:

(Cookie(version=0, name='BDORZ', value='27315', port=None, port_specified=False, domain='.baidu.com'...

要想发送你的 cookies 到服务器,可以使用 cookies 参数:

cookies = {'BDUSS': 'n5-fjRvZ95b...', 'ispeed_lsm': '2', 'BD_UPN': '1a314753'} # 具体内容可用 fiddler 抓包获取r = requests.get('http://www.baidu.com', cookies=cookies,timeout=5)print(r.status_code)
原创粉丝点击