Python3 Requests 的使用 & 静态页面捉取
1.获取响应内容
#!/usr/bin/python
#coding: UTF-8
import requests
r = requests.get('http://www.santostang.com/')
print("文本编码:", r.encoding)
#服务器内容使用的文本编码,如:UTF-8。
print("响应状态码:", r.status_code)
#用于检测响应的状态码。
#200,表示请求成功。
#4xx,表示客户端错误。
#5xx,表示服务器响应错误。
print("字节方式的响应体:", r.content)
#字节方式的响应体,会自动解析 gzip 和 deflate 编码的响应数据。
print("字符串方式的响应体:", r.text)
#服务器响应的内容,会自动根据响应头部的字符编码进行解码。
print("JSON:", r.json())
#Requests 内置的 JSON 解码器。
2.定制 Requests
2.1. 传递 URL 参数
#!/usr/bin/python
#coding: UTF-8
import requests
key_dict = {'key1': 'value1', 'key2': 'value2'}
r = requests.get('http://httpbin.org/get', params = key_dict)
print("URL 已经正确编码:", r.url)
print("字符串方式的响应体:\n", r.text)
得到结果:
URL 已经正确编码: http://httpbin.org/get?key1=value1&key2=value2
字符串方式的响应体:
{
"args": {
"key1": "value1",
"key2": "value2"
},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Connection": "close",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.19.1"
},
"origin": "116.20.113.241",
"url": "http://httpbin.org/get?key1=value1&key2=value2"
}
2.2. 定制请求头
#!/usr/bin/python
#coding: UTF-8
import requests
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.117 Safari/537.36',
'Host': 'www.santostang.com'
}
r = requests.get('http://www.santostang.com/', headers = headers)
print("响应状态码:", r.status_code)
2.3. 发送 POST 请求
#!/usr/bin/python
#coding: UTF-8
import requests
key_dict = {'key1': 'value1', 'key2': 'value2'}
r = requests.post('http://httpbin.org/post', data = key_dict)
print(r.text)
得到结果:
{
"args": {},
"data": "",
"files": {},
"form": {
"key1": "value1",
"key2": "value2"
},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Connection": "close",
"Content-Length": "23",
"Content-Type": "application/x-www-form-urlencoded",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.19.1"
},
"json": null,
"origin": "116.20.113.241",
"url": "http://httpbin.org/post"
}
2.4. 请求超时
#!/usr/bin/python
#coding: UTF-8
import requests
link = "http://www.santostang.com/"
r = requests.get(link, timeout = 0.001)
0.001(秒),应该可以看到超时时所跑出的异常,一般设置该值为 20(秒)。
3. Requests 爬虫实践(静态页面捉取):Top 250 电影数据
网址:https://movie.douban.com/top250
该网页一页共有 25 组数据,共有 10 页。
第 2 页网址:https://movie.douban.com/top250?start=25
第 3 页网址:https://movie.douban.com/top250?start=50
...
第 10 页网址:https://movie.douban.com/top250?start=225
浏览器获取到的请求头:(重要)
Host: movie.douban.com
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.117 Safari/537.36
第一个内容的格式:
<li>
<div class="item">
<div class="pic">
<em class="">1</em>
<a href="https://movie.douban.com/subject/1292052/">
<img width="100" alt="肖申克的救赎" src="https://img3.doubanio.com/view/photo/s_ratio_poster/public/p480747492.webp" class="">
</a>
</div>
<div class="info">
<div class="hd">
<a href="https://movie.douban.com/subject/1292052/" class="">
<span class="title">肖申克的救赎</span>
<span class="title"> / The Shawshank Redemption</span>
<span class="other"> / 月黑高飞(港) / 刺激1995(台)</span>
</a>
<span class="playable">[可播放]</span>
</div>
<div class="bd">
<p class="">
导演: 弗兰克·德拉邦特 Frank Darabont 主演: 蒂姆·罗宾斯 Tim Robbins /...<br>
1994 / 美国 / 犯罪 剧情
</p>
<div class="star">
<span class="rating5-t"></span>
<span class="rating_num" property="v:average">9.6</span>
<span property="v:best" content="10.0"></span>
<span>1174888人评价</span>
</div>
<p class="quote">
<span class="inq">希望让人自由。</span>
</p>
</div>
</div>
</div>
</li>
代码:
#!/usr/bin/python
#coding: UTF-8
import requests
from bs4 import BeautifulSoup
def get_movies():
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.117 Safari/537.36',
'Host': 'movie.douban.com'
}
movie_list = []
for i in range(0, 10) :
link = 'https://movie.douban.com/top250?start=' + str(i * 25)
r = requests.get(link, headers = headers, timeout = 10)
print(str(i + 1), "页响应状态码:", r.status_code)
# print(r.text)
soup = BeautifulSoup(r.text, "lxml")
div_list = soup.find_all('div', class_ = 'hd')
for each in div_list:
movie = each.a.span.text.strip()
movie_list.append(movie)
return movie_list
movies = get_movies()
print(movies)
得到:
1 页响应状态码: 200
2 页响应状态码: 200
3 页响应状态码: 200
4 页响应状态码: 200
5 页响应状态码: 200
6 页响应状态码: 200
7 页响应状态码: 200
8 页响应状态码: 200
9 页响应状态码: 200
10 页响应状态码: 200
['肖申克的救赎', '霸王别姬', '这个杀手不太冷', '阿甘正传', '美丽人生', '泰坦尼克号', '千与千寻', '辛德勒的名单', '盗梦空间', '机器人总动员', '忠犬八公的故事', '三傻大闹宝莱坞', '海上钢琴师', '放牛班的春天', '大话西游之大圣娶亲', '楚门的世界', '教父', '龙猫', '星际穿越', '熔炉', '无间道', '触不可及', '当幸福来敲门', '乱世佳人', '怦然心动', '疯狂动物城', '天堂电影院', '蝙蝠侠:黑暗骑士', '活着', '十二怒汉', '少年派的奇幻漂流', '鬼子来了', '指环王3:王者无敌', '搏击俱乐部', '天空之城', '控方证人', '飞屋环游记', '大话西游之月光宝盒', '罗马假日', '窃听风暴', '摔跤吧!爸爸', '两杆大烟枪', '辩护人', '闻香识女人', '飞越疯人院', '哈尔的移动城堡', '死亡诗社', 'V字仇杀队', '海豚湾', '教父2', '指环王2:双塔奇兵', '指环王1:魔戒再现', '美丽心灵', '饮食男女', '情书', '素媛', '狮子王', '美国往事', '钢琴家', '小鞋子', '七宗罪', '被嫌弃的松子的一生', '致命魔术', '天使爱美丽', '本杰明·巴顿奇事', '西西里的美丽传说', '黑客帝国', '让子弹飞', '拯救大兵瑞恩', '音乐之声', '看不见的客人', '末代皇帝', '低俗小说', '勇敢的心', '剪刀手爱德华', '沉默的羔羊', '大闹天宫', '蝴蝶效应', '春光乍泄', '入殓师', '心灵捕手', '哈利·波特与魔法石', '玛丽和马克思', '布达佩斯大饭店', '阳光灿烂的日子', '禁闭岛', '猫鼠游戏', '幽灵公主', '第六感', '重庆森林', '狩猎', '致命ID', '断背山', '穿条纹睡衣的男孩', '大鱼', '加勒比海盗', '阿凡达', '告白', '摩登时代', '一一', '甜蜜蜜', '射雕英雄传之东成西就', '阳光姐妹淘', '消失的爱人', '爱在黎明破晓前', '上帝之城', '侧耳倾听', '爱在日落黄昏时', '风之谷', '超脱', '小森林 夏秋篇', '喜剧之王', '倩女幽魂', '恐怖直播', '红辣椒', '菊次郎的夏天', '驯龙高手', '幸福终点站', '神偷奶爸', '借东西的小人阿莉埃蒂', '岁月神偷', '杀人回忆', '七武士', '萤火虫之墓', '怪兽电力公司', '谍影重重3', '喜宴', '小森林 冬春篇', '贫民窟的百万富翁', '电锯惊魂', '东邪西毒', '请以你的名字呼唤我', '记忆碎片', '真爱至上', '黑天鹅', '疯狂原始人', '哈利·波特与死亡圣器(下)', '萤火之森', '7号房的礼物', '雨人', '英雄本色', '卢旺达饭店', '海洋', '心迷宫', '超能陆战队', '唐伯虎点秋香', '蝙蝠侠:黑暗骑士崛起', '荒蛮故事', '傲慢与偏见', '海边的曼彻斯特', '虎口脱险', '纵横四海', '燃情岁月', '教父3', '时空恋旅人', '玩具总动员3', '花样年华', '完美的世界', '恋恋笔记本', '无人知晓', '达拉斯买家俱乐部', '二十二', '雨中曲', '魂断蓝桥','猜火车', '血战钢锯岭', '穿越时空的少女', '我是山姆', '冰川时代', '人工智能', '爆裂鼓手', '浪潮', '未麻的部屋', '罗生门', '朗读者', '被解救的姜戈', '头脑特工队', '香水', '阿飞正传', '你的名字。', '可可西里', '恐怖游轮', '房间', '一次别离', '战争之王', '追随', '撞车', '模仿游戏', '一个叫欧维的男人决定去死', '忠犬八公物语', '地球上的星星', '魔女宅急便', '完美陌生人', '谍影重重', '谍影重重2', '牯岭街少年杀人事件', '哪吒闹海', '梦之安魂曲', '青蛇', '惊魂记', '黑客帝国3:矩阵革命', '小萝莉的猴神大叔', '再次出发之纽约遇见你', '东京物语', '新龙门客栈', '海街日记', '步履不停', '源代码', '终结者2:审判日', '绿里奇迹', '末路狂花', '初恋这件小事', '无敌破坏王', '秒速5厘米', '城市之光', '无耻混蛋', '爱在午夜降临前', '这个男人来自地球', '碧海蓝天', '疯狂的石头', '勇闯夺命岛', 'E.T. 外星人', '变脸', '卡萨布兰卡', '海盗电台', '发条橙','黄金三镖客', '彗星来的那一夜', '美国丽人', '聚焦', '血钻', '荒野生存', '国王的演讲', '非常嫌疑犯', '英国病人', '迁徙的鸟', '黑鹰坠落', '我爱你', '勇士', '遗愿清单', '荒岛余生', '燕尾蝶', '枪火', '2001太空漫游', '叫我第一名', '穆赫兰道', '千钧一发', '上帝也疯狂', '大卫·戈尔的一生', '蓝色大门']
代码中的
div_list = soup.find_all('div', class_ = 'hd')
也可以用这个来代替:
注意这里 class属性中有空格,都转为.
div_list = soup.select('div .hd')