Python爬虫入门系列——Urllib详解
1.背景
1.1 初识爬虫
网络爬虫,是一种按照一定规则,自动抓取互联网信息的程序或者脚本,其本质是模拟浏览器打开网页,获取网页中我们想要的数据。常用的百度、谷歌的搜索引擎也是一个爬虫,把互联网中的数据搜集组合起来便于用户检索。
1.2 合法性
网络爬虫领域当前还属于拓荒阶段, “ 允许哪些行为 ” 这种基本秩序还处于建设之中。如果抓取的数据属于个人使用或科研范畴,基本不存在问题; 如果数据属于商业盈利范畴,就要就事而论,可能违法,可能不违法。
1.3 robots协议
Robots协议(也称为爬虫协议、机器人协议等)的全称是“网络爬虫排除标准”(Robots Exclusion Protocol),内容网站通过Robots协议告诉搜索引擎怎样更高效的索引到结果页并提供给用户。它规定了网站里的哪些内容可以抓取,哪些不可以抓取,大部分网站都会有一个robots协议,一般存在网站的根目录下,命名为robots.txt,以知乎为例,https://www.zhihu.com/robots.txt
但robots协议终究是业内的一个约定,到底如何做还得看使用者。在使用爬虫时,应稍微克制一下行为,而不是使劲的薅,看看12306都惨成啥样了,被各种抢票软件,各路爬虫疯狂输出……
2.要求
2.1 当前开发环境
- 操作系统:Window 10
- python版本:3.8
- 编辑器:pycharm
- 库管理:Anconda
以上是我电脑的配置,python版本起码3+;编辑器不限制,看自己喜欢;Anconda是真的好用,早用早享受
2.2 编程基础
- 要有一定的前端知识,会HTML,CSS,JS的基础用法
- 懂得Python的基础语法
3.快速上手Urllib
Urllib是python内置的一个http请求库,不需要额外的安装。只需要关注请求的链接,参数,提供了强大的解析功能
Urllib库有四个模块:request,error, parse, robotparser
- request:发起请求(重要)
- error:处理错误
- parse:解析RUL或目录等
- robotparser(不怎么用):解析网站的robot.txt
3.1 request模块
方法介绍:
1.请求方法
urllib.request.urlopen(url, data=None, [timeout, ]*)
url:地址,可以是字符串,也可以是一个Request对象
data:请求参数
timeout:设置超时
一个简单的get请求:
"""
# 爬虫就是模拟用户,向服务器发起请求,服务器会返回对应数据
# 数据抓包,使用chrome,尽量不要使用国产浏览器
# F12打开界面,点击network,刷新,会显示网页的请求,常见的请求有GET, POST, PUT, DELETE, HEAD, OPTIONS, TRACE,其中GET 和 POST 最常用
# GET请求把请求参数都暴露在URL上
# POST请求的参数放在request body,一般会对密码进行加密
# 请求头:用来模拟一个真实用户
# 相应状态码:200表示成功
"""
# 引入请求模块
import urllib.request
# 发起请求,设置超时为1s
response = urllib.request.urlopen('http://www.baidu.com', timeout = 1)
# 使用read()读取整个页面内容,使用decode('utf-8')对获取的内容进行编码
print(response.read().decode('utf-8'))
print(response.status) # 状态码,判断是否成功,200
print(response.getheaders()) # 响应头 得到的一个元组组成的列表
print(response.getheader('Server')) #得到特定的响应头
推荐一个测试网站,用于提交各种请求:http://httpbin.org/,该网站的更多的用法自行搜索
一个简单的post请求
import urllib.parse
import urllib.request
# data需要的是字节流编码格式的内容,此时请求方式为post
data = bytes(urllib.parse.urlencode({
"name": "WenAn"}), encoding= 'utf-8')
response = urllib.request.urlopen('http://httpbin.org/post', data= data)
print(response.read().decode('utf-8'))
Request对象
浏览器发起请求时都会有请求头header,爬虫想要爬取信息时,添加header,让服务器以为你是浏览器,而不是一个爬虫。urlopen无法添加其他参数,因此我们需要声明一个request对象来添加header
如何获取Header:
随便打开一个网页(以chrome为例),快捷键F12或者右键打开开发者页面,点击network,刷新页面,再随便点击一个链接</