爬虫入门知识+简单案例《python网络爬虫从入门到实践》静态网页抓取
安装Requests
打开windows的cmd或者mac的终端,输入:
pip install requests
获取响应内容
requests.get( )方法获取响应内容
import requests
r=requests.get('https://www.baidu.com/?tn=02003390_3_hao_pg')
r.encoding
Out[3]: 'ISO-8859-1'
r.status_code
Out[4]: 200
响应对象(以r为例)的一些具体信息
响应对象信息 | 描述 |
---|
r.text | 服务器响应的内容,会自动根据响应头部的字符编码进行解码 | r.encoding | 服务器内容使用的文本编码 | r.status_code | 用于检测响应的状态码,返回200:请求成功了;返回4XX:表示客户端错误;返回5XX:表示服务器错误响应 | r.content | 是字节方式的响应体,会自动解码gzip和deflate编码响应的数据 | r.json | 是Requests中内置的JSON解码 |
案例1:第一个爬虫
爬取搜狗页面并保存
import requests
if __name__ == "__main__":
# step1:指定url
url = 'https://www.sogou.com/'
# step2:发起请求
# get方法会返回一个响应对象
response = requests.get(url=url)
# step3:获取响应数据.text返回的是字符串形式的响应数据
page_text = response.text
print(page_text)
# step4:持久化存储
with open('./sogou.html', 'w', encoding='utf-8') as fp:
fp.write(page_text)
print("爬取数据结束!")
定制Requests
有些网页,需要对Requests的参数进行设置才能获取需要的数据,包括传递URL参数、定制请求头、发送POST请求、设置超时等
传递URL参数params:
URL参数可以用来请求特定的数据,比如说在百度中搜索某个特定值得到的网页。
- 如果是自己直接构建的URL,数据一般会跟在一个问号后面,以键值对的形式放。如:“https://www.baidu.com/s?wd=%E9%A9%AC%E4%BA%91”。‘wd’就是参数名,后面的‘%E9%A9%AC%E4%BA%91’就是参数值。(每次都直接构建的话,就很麻烦了)
- 在Requests中,可以直接把这些参数保存在字典中,用params(参数)传递到url中。
key_dict={'key1':'value1','key2':'value2'}
r=requests.get('http://httpbin.org/get',params=key_dict)
[结合案例2:爬取搜狗指定词条对应的搜索结果页面,更容易理解]
定制请求头headers:
-User-Agent:请求载体的身份标识
-Connection:请求完毕后,是断开连接还是保持连接。
- UA伪装:是一种反反爬虫机制。门户网站的服务器会检测对应请求的载体身份标识,如果检测到请求的载体的身份标识是某一浏览器说明该请求是一个正常请求。如果不是,则表示该请求是一个不正常的请求。则请求可能会被拒绝。所以我们的爬虫程序需要进行UA伪装(绝大部分的爬虫程序都需要进行UA伪装)
在requests中,我们可以利用参数Headers伪装成浏览器身份,具体参考案例2
发送post请求
post请求就是:requests.post()。实现post请求,要传递一个字典给requests中的data参数,这个数据字典就会咋发出请求时自动编码为表单形式。【参考案例3】
设置超时timeout
timeout参数:在特定的描述结束之后停止等待响应。
即:如果服务器在timeout秒之内没有应答,则返回异常。
案例2:建议网页采集器
需求:爬取搜狗指定词条对应的搜索结果页面
import requests
headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36'}
url='https://www.baidu.com/s?'
kw=input("enter a word:")
param={
'wd':kw
}
response=requests.get(url=url,params=param,headers=headers)
page_text=response.text
print(page_text)
fileName=kw+'.html'
with open(fileName,'w',encoding='utf-8') as fp:
fp.write(page_text)
print(fileName,'保存成功!')
案例3:破解百度翻译
需求:输入单词能够爬取百度翻译中对应的翻译内容
- 2、选择【XHR】类型的数据包,查看哪个数据包是用来得到翻译效果的
#-post请求(携带了参数)
#-响应数据是一组json数据
import requests
import json
#1.指定url
post_url='https://fanyi.baidu.com/sug'
#2.进行UA伪装
headers={'headers':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36'}
#3.post请求参数处理,同get一样
word=input('enter a word:')
data={'kw':word}
#4.请求发送
response=requests.post(url=post_url,data=data,headers=headers)#是json数据
#5.获取相应数据:json()方法返回的是obj,(只有确定相应数据的类型,才可以使用json)
dic_obj=response.json()
print(dic_obj)
#6.进行持久化存储
filename=word+'.json'
fp=open(filename,'w',encoding='utf-8')
json.dump(dic_obj,fp=fp,ensure_ascii=False)#中文不能使用ascii码编码
print('over!')
案例4:豆瓣电影排行榜前250进行解析
案例来源于《python网络爬虫从入门到实战》。
需求:对豆瓣电影排行榜前250名的页面进行抓取;获取这些电影的名字。
-
分析网页:250名电影一共有10页,每页有25条数据。第一页的网址为”https://movie.douban.com/top250?start=0”;第二页的网址为:“https://movie.douban.com/top250?start=25”(也可以是https://movie.douban.com/top250?start=25&filter=,后面这个“&filter没影响”) 可以发现:这些网页的网址,前面都是相同的,控制第几页的参数就是问号后面的“start”。 -
设置url:可以利用循环,构建完整的url字符串;也可以用参数params -
设置headers,进行爬取,获取服务器数据。 -
利用bs4中的BeautifulSoup解析,获取电影名字
import requests
from bs4 import BeautifulSoup
def get_moives():
headers={'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36'}
moive_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)
soup=BeautifulSoup(r.text,'lxml')
div_list =soup.find_all('div',class_='hd')
for each in div_list:
moive=each.a.span.text.strip()
moive_list.append(moive)
return moive_list
print(get_moives())
'''
1 页面响应状态: 200
2 页面响应状态: 200
3 页面响应状态: 200
4 页面响应状态: 200
5 页面响应状态: 200
6 页面响应状态: 200
7 页面响应状态: 200
8 页面响应状态: 200
9 页面响应状态: 200
10 页面响应状态: 200
['肖申克的救赎', '霸王别姬', '阿甘正传', '泰坦尼克号', '这个杀手不太冷', '美丽人生', '千与千寻', '辛德勒的名单', '盗梦空间', '忠犬八公的故事', '星际穿越', '楚门的世界', '海上钢琴师', '三傻大闹宝莱坞', '机器人总动员', '放牛班的春天', '无间道', '疯狂动物城', '大话西游之大圣娶亲', '熔炉', '控方证人', '教父', '当幸福来敲门', '触不可及', '怦然心动', '龙猫', '末代皇帝', '寻梦环游记', '蝙蝠侠:黑暗骑士', '活着', '哈利·波特与魔法石', '指环王3:王者无敌', '乱世佳人', '素媛', '飞屋环游记', '摔跤吧!爸爸', '我不是药神', '何以为家', '十二怒汉', '哈尔的移动城堡', '少年派的奇幻漂流', '鬼子来了', '大话西游之月光宝盒', '猫鼠游戏', '天空之城', '闻香识女人', '天堂电影院', '指环王2:双塔奇兵', '钢琴家', '让子弹飞', '罗马假日', '海蒂和爷爷', '指环王1:护戒使者', '黑客帝国', '大闹天宫', '教父2', '死亡诗社', '辩护人', '狮子王', '绿皮书', '搏击俱乐部', '饮食男女', '美丽心灵', '本杰明·巴顿奇事', '窃听风暴', '情书', '穿条纹睡衣的男孩', '两杆大烟枪', '西西里的美丽传说', '看不见的客人', '拯救大兵瑞恩', '音乐之声', '飞越疯人院', '小鞋子', '阿凡达', '哈利·波特与死亡圣器(下)', '沉默的羔羊', '海豚湾', '致命魔术', '禁闭岛', '布达佩斯大饭店', '蝴蝶效应', '美国往事', '心灵捕手', '低俗小说', '春光乍泄', '摩登时代', '七宗罪', '喜剧之王', '致命ID', '杀人回忆', '功夫', '超脱', '哈利·波特与阿兹卡班的囚徒', '加勒比海盗', '被嫌弃的松子的一生', '红辣椒', '狩猎', '请以你的名字呼唤我', '7号房的礼物', '剪刀手爱德华', '勇敢的心', '断背山', '唐伯虎点秋香', '入殓师', '第六感', '天使爱美丽', '哈利·波特与密室', '爱在黎明破晓前', '重庆森林', '一一', '幽灵公主', '蝙蝠侠:黑暗骑士崛起', '小森林 夏秋篇', '阳光灿烂的日子', '菊次郎的夏天', '超能陆战队', '完美的世界', '无人知晓', '爱在日落黄昏时', '消失的爱人', '小森林 冬春篇', '借东西的小人阿莉埃蒂', '倩女幽魂', '甜蜜蜜', '侧耳倾听', '幸福终点站', '时空恋旅人', '驯龙高手', '萤火之森', '玛丽和马克思', '怪兽电力公司', '教父3', '一个叫欧维的男人决定去死', '大鱼', '玩具总动员3', '告白', '傲慢与偏见', '神偷奶爸', '寄生虫', '釜山行', '阳光姐妹淘', '射雕英雄传之东成西就', '被解救的姜戈', '未麻的部屋', '恐怖直播', '哪吒闹海', '我是山姆', '哈利·波特与火焰杯', '血战钢锯岭', '头号玩家', '新世界', '模仿游戏', '七武士', '喜宴', '黑客帝国3:矩阵革命', '花样年华', '头脑特工队', '电锯惊魂', '三块广告牌', '卢旺达饭店', '你的名字。', '达拉斯买家俱乐部', '疯狂原始人', '上帝之城', '谍影重重3', '英雄本色', '风之谷', '心迷宫', '惊魂记', '九品芝麻官', '纵横四海', '海街日记', '岁月神偷', '记忆碎片', '忠犬八公物语', '荒蛮故事', '爱在午夜降临前', '绿里奇迹', '爆裂鼓手', '小偷家族', '贫民窟的百万富翁', '色,戒', '真爱至上', '东邪西毒', '无敌破坏王', '疯狂的石头', '冰川时代', '雨中曲', '黑天鹅', '你看起来好像很好吃', '恐怖游轮', '2001太空漫游', '雨人', '茶馆', '恋恋笔记本', '魔女宅急便', '遗愿清单', '城市之光', '萤火虫之墓', '可可西里', '大佛普拉斯', '无间道2', '牯岭街少年杀人事件', '虎口脱险', '源代码', '人工智能', '初恋这件小事', '海边的曼彻斯特', '背靠背,脸对脸', '东京教父', '小丑', '罗生门', '终结者2:审判日', '青蛇', '奇迹男孩', '二十二', '波西米亚狂想曲', '房间', '疯狂的麦克斯4:狂暴之路', '新龙门客栈', '无耻混蛋', '魂断蓝桥', '血钻', '千钧一发', '步履不停', '黑客帝国2:重装上阵', '彗星来的那一夜', '战争之王', '崖上的波妞', '心灵奇旅', '爱乐之城', '谍影重重2', '燃情岁月', '阿飞正传', '海洋', '谍影重重', '再次出发之纽约遇见你', '穿越时空的少女', '火星救援', '末路狂花', '朗读者', '香水', '地球上的星星', '我爱你', '完美陌生人', '千年女优', '驴得水', '聚焦', '浪潮']
'''
|