Python爬虫简介
网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。
其实通俗的讲就是通过我们自己写的程序来模拟浏览器访问网页的过程,从而快速高效的获得互联网中的数据
Request & Response
浏览器访问互联网中的服务器以获取数据资源是通过请求的方式进行的,浏览器给服务器发送的消息就叫做HTPP Request,而服务器返回给我们的数据信息就是Response,在浏览器中我们一般可以通过F12按键找到相应的信息,我这里以FireFox为例,当我按下F12后,可以在网络中看到浏览器在访问网页时发送与接收的数据包
我们点开一个数据包即可在右侧消息头中找到对应的请求头和相应头,也就是我们的Request和Response,这也就是我们的浏览器和服务器之间交换的数据的详细信息
我们需要关注的是在Request请求头中有一个参数是User-Agent,这是浏览器用于说明自己身份的参数,里面包含了浏览器的引擎版本、浏览器版本信息等等,(更多请参考User-Agent)
我们在利用脚本访问网页时,通常需要声明这个参数来表示“我”只是一个普通的浏览器。
同样的,我们在查看Response响应头信息时有时也可以看到有一个参数叫Content-Type用于声明放回的数据为何种类型。(更多请求头和响应头的参数或属性可以点这里参考)
AJAX请求
我们需要了解的是这种请求是用于在无需加载整个网页的情况下能够更新部分网页的技术
更多详细信息可以参考这里
Robots协议
robots相当于一种君子协定,用于声明该网站中的哪些内容是可以被爬虫获取的,而哪些内容是不可以被爬虫获取的(更多资料)
最简单的robots.txt只有两条规则:
1.User-agent:指定对哪些爬虫生效
2.Disallow:指定要屏蔽的网址
User-agent: * 表示对所有的爬虫以下约定有效
例如这里的baidu.com的robots协议的部分内容
这部分对本次实例没有直接相关,但是还是希望大家能够遵循该协议,因为
Robots协议是国际互联网界通行的道德规范,基于以下原则建立:
1、搜索技术应服务于人类,同时尊重信息提供者的意愿,并维护其隐私权;
2、网站有义务保护其使用者的个人信息和隐私不被侵犯。
爬取百度翻译实例
掌握了上述内容,我们开始做一个最简单的python爬虫,目标是利用我们的爬虫小程序就可以直接得到百度翻译的结果,而不需要打开网页中的百度翻译
首先我们打开百度翻译的页面,首先访问以下该页面的robots.txt,没有发现任何内容
然后我们随意输入一个单词并F12观察请求包,这里XHR就可以看到AJAX请求,并且可以看到它访问的是百度翻译网站中的/sug目录,User-Agent说明了浏览器的身份
并且在响应头中我们也可以看到响应的数据类型是json类型的数据
我们逐个点开这些请求并观察请求的内容,很快找到我们输入的单词,并且在响应中发现了单词翻译的结果
至此我们的目标变得更加清晰,我们需要模拟浏览器发送POST请求,并获取其返回的json数据
上代码
*requests这个库可以直接pip install requests安装
'''
2021/2/24
author:monster663
百度翻译的简易爬取
'''
import requests
url='https://fanyi.baidu.com/sug'
#User-Agent的内容直接从浏览器中复制下来
headers={
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:85.0) Gecko/20100101 Firefox/85.0'
}
key_word=input('请输入你想翻译的单词: ')
data={
'kw':key_word
}
response=requests.post(url=url,data=data,headers=headers)
#将回显的结果解析
res=response.json()
#print(res) #原始数据 拿到原始数据我们的目的已经达到,为了更好优化输出我们继续探究
#print(type(res)) 原始数据类型是字典
#print(res['data']) 获取data键对应的数据
#print(type(res['data'])) 发现它是列表类型
#优化输出过程
print('原始单词:'+key_word)
print('翻译结果:')
num=len(res['data'])
#print(num) 翻译结果数量
for i in range(num):
print(str(i+1)+'.'+str(res['data'][i]['k'])+' '+str(res['data'][i]['v']))
运行测试
多组数据测试均正常,支持中英文的翻译,这样就不需要打开百度翻译页面再进行翻译了
输出结果可以根据自己的需要进行调整
豆瓣电影排行榜爬取实例
同样的,我们登入豆瓣的官网,首先浏览robots.txt查看哪些内容不能爬取
然后我们点击排行榜,剧情
然后我们看到这个页面,发现当我们把页面下拉到底部是,页面会自动刷新更多的电影,我们同样的按下F12查看网络数据包
同样的我们看到浏览器访问了
https://movie.douban.com/j/chart/top_list并得到了一个json格式的数据,于是我们按照之前的思路上代码
'''
2021/2/24
author:monster663
豆瓣电影的简易爬取
'''
import requests
url='https://movie.douban.com/j/chart/top_list'
#User-Agent的内容直接从浏览器中复制下来
headers={
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:85.0) Gecko/20100101 Firefox/85.0'
}
#start=input('请输入您想从第几部电影开始爬取(第一部电影的下标为0): ')
#默认从第一部电影信息开始爬取
print('电影种类编号:')
print('剧情片[11] 喜剧片[24]')
print('动作片[5] 爱情片[13]')
print('科幻片[17] 动画片[25]')
print('悬疑片[10] 惊悚片[19]')
movie_type=input('请输入您想爬取的电影的种类:')
#这里仅举例一些,更多的可以查看url中的type参数获取
limit=input('请输入您想爬取的电影的数量: ')
params={
'type':movie_type, #电影种类
'interval_id':'100:90', #好于90%的剧情篇电影
'action':'',
'start':0, #从第几部电影开始取
'limit':limit #取得的电影数量
}
response=requests.get(url=url,headers=headers,params=params)
movie_data=response.json()
#print(movie_data)
f=open('movie_data.json','w',encoding='utf-8')
f.write(str(movie_data))
f.close()
print('原始数据已经保存')
num=len(movie_data)
for i in range(num):
print('['+str(i)+'] 电影名称:'+movie_data[i]['title'])
print('电影类型:'+str(movie_data[i]['types']))
print('电影评分:'+movie_data[i]['rating'][0])
print('主演'+str(movie_data[i]['actors']))
print('地区:'+str(movie_data[i]['regions']))
print()
运行测试
我们尝试爬取前十的科幻电影,首先找到科幻电影榜
运行结果如下:
可以看到已经正确爬取了电影榜中的相关电影信息
若还有其他疑问欢迎评论区留言或私信
参考文献
Python爬虫简介
Robots协议
AJAX请求
请求头和响应头参数解析
User-Agent解析
感谢上述博主的优秀博文