python 爬虫系列02 认识 requests

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

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

GET

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

import requests

r = 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 requests

params = {'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 requests
import json

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

Headers

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

import requests

url = '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地址库API
try:
    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 requests

r = 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)

猜你喜欢

转载自blog.csdn.net/hepann44/article/details/77835849