MOOC《Python网络爬虫和信息提取》(第11次)
网络爬虫之规则 21.07.14
学习目标
- 掌握定向网络爬取和页面解析的基本能力
- Requests库
- robots.txt 盗亦有道
- 5个实战项目Projects
单元1:Requests库入门
1、pycharm安装:
打开设置->选择Project的Python interpreter->点击添加
输入requests->点击左下角install,等待片刻,安装完毕
验证安装成功:
import requests
r = requests.get("http://www.baidu.com")
var = r.status_code # 200
print(var)
r.encoding = 'urf-8'
print(r.text)
输出结果:
2、Requests库
Requests库的2个重要对象
Response:一个class类
Request:一个基本方法
2.1 Requests库7个主要方法
requests.request() # 构造一个请求,支撑以下各方法的基础方法
requests.get() # 获取HTML网页的主要方法,对应于HTTP的GET
requests.head() # 获取HTML网页头信息的方法,对应于HTTP的HEAD
requests.post() # 向HTML网页提交POST请求的方法,对应于HTTP的POST
requests.put() # 向HTML网页提交PUT请求的方法,对应于HTTP的PUT
requests.patch() # 向HTML网页提交局部修改请求,对应于HTTP的PATCH
requests.delete() # 向HTML页面提交删除请求,对应于HTTP的DELETE
2.2 Response对象的属性
r.status_code #HTTP请求的返回状态,200表示连接成功,404表示失败
r.text # HTTP响应内容的字符串形式,即,url对应的页面内容
r.header # 展现HTTP响应内容的头部内容
r.encoding # 从HTTP header中猜测的响应内容编码方式
r.apparent_encoding
# 从内容中分析出的响应内容编码方式(备选编码方式)
r.content # HTTP响应内容的二进制形式
2.3 编码方式
import requests
# 查看编码方式
# r.encoding 从HTTP header 中猜测的响应内容编码方式
# r.apparent_coding 从 内容 中分析响应内容编码方式(备选编码方式)
# 推荐用 apparent_coding
r = requests.get("http://www.baidu.com")
print(r.status_code)
print(r.text)
print(r.encoding) # 编码为 ISO-8859-1,不能解析中文
print(r.apparent_encoding)
r.encoding = 'urf-8' # 部分内容转换成中文
print(r.text)
3、爬取网页的通用代码框架
3.1 Requests库的异常
异常 | 说明 |
---|---|
requests.ConnectionError | 网络连接错误异常,如DNS查询失败、拒绝连接等 |
requests.HTTPError | HTTP错误异常 |
requests.URLRequired | URL缺失异常 |
requests.TooManyRedirects | 超过最大重定向次数,产生重定向异常(常指对复杂链接的访问) |
requests.ConnectTimeout | 连接远程服务器超时异常 (连接过程超时) |
requests.Timeout | 请求URL超时,产生超时异常 (整个过程超时) |
r.raise_for_status() | 如果不是200,产生异常requests.HTTPError |
3.2 爬取网页的通用代码框架
import requests
def getHTMText (ur1) :
try :
r = requests.get (ur1, timeout=30)
r.raise_for_status () #如果状态不是200,引发HTTPError异常
r.encoding =r.apparent_encoding
return r.text
except:
return "产生异常"
if __name__ =="__main__":
# url1 = "http://www.baidu.com"
url1 = "www.baidu.com"
print(getHTMText(url1))
4、 HTTP协议
HTTP,Hypertext Transfer Protocol,超文本传输协议。
HTTP是一个基于“请求与响应”模式的、无状态的应用层协议。
–用户发起请求,服务器做相关响应,就是“请求与响应”的模式;
–无状态是指第一次请求和第二次请求之间并没有相关的关联;
–应用层协议指的是该协议工作在TCP协议之上。
HTTP协议采用URL作为定位网络资源的标识。
–URL格式 http//:host [:port] [path]
host:合法的Internet主机域名或P地址
port:端号,缺省端口为80
path:请求资源的路径
HTTP协议对资源的操作
获取:GET,HEAD
修改:POST,PUT,PATCH,DELETE
–与requests的七个方法相对应
方法 | 说明 |
---|---|
GET | 请求获取URL位置的资源 |
HEAD | 请求获取URL位置资源的响应消息报告,即获得该资源的头部信息 |
POST | 请求向URL位置的资源后附加新的数据 |
PUT | 请求向URL位置存储一个资源,覆盖原URL位置的资源 |
PATCH | 请求局部更新URL位置的资源,即改变该处资源的部分内容 |
DELETE | 请求删除URL位置存储的资源 |
5、Requests库的主要方法解析
-
requests.request(method, url,**kwargs)
–method:请求方式,对应get/put/post等7种(与封装方法一致)
–url:拟获取页面的url链接
–kwargs:控制访问的参数,共13个
- params:字典或字节序列,作为参数增加到url中
- data: 字典、字节序列或文件对象,作为Request的内容
- json: JSON格式的数据,作为Request的内容
- headers:字典,HTTP定制头
- cookies:字典或CookieJar,Request中的cookie
- author: 元组,支持HTTP认证功能
- file: 字典类型,传输文件
- timeout:设定超时时间,秒为单位
- proxies:字典类型,设定访问代理服务其,可以增加登录认证
- allow_redirects: True/False,默认为True,重定向开关,表示允不允许对URL进行重定向
- stream: True/False,默认为True,获取内容立即下载开关(默认下载)
- verify: True/False,默认为True,认证SSL证书开关
- cert: 本地SSL证书路径
- requests.get(url,params=None,**kwargs)
- requests.head(url,**kwargs)
- requests.post(url,data=None,json=None,**kwargs)
- requests.put(url,data=None,**kwargs)
- requests.patch(url,data=None,**kwargs)
- requests.delete(url,**kwargs)
6、练习
'''
题目:
请编写一个小程序,“任意”找个url,测试一下成功爬取100次网页的时间。
(某些网站对于连续爬取页面将采取屏蔽IP的策略,所以,要避开这类网站。
'''
# 参考代码
import requests
import time
def getHTMLText(url):
try:
r = requests.get(url, timeout=30)
r.raise_for_status() # 如果状态不是200,引发HTTPError异常
r.encoding = r.apparent_encoding
return True
except:
return "异常"
if __name__ == "__main__":
url = "https://www.zhihu.com/"
# url = "https://www.baidu.com"
# url = "https://www.csdn.net/"
start_time = time.time()
n = input("重复多少次:")
for i in range(eval(n)):
if getHTMLText(url) == False:
print("产生了异常")
exit()
end_time = time.time()
timeNow = end_time - start_time
print("爬取{}次网页使用时间:{:.2f}秒".format(n, timeNow))
单元2:网络爬虫的盗亦有道
1、网络爬虫引发的问题
1.1网络爬虫的尺寸
- 小规模,数据量小,爬取速度不敏感,Requestsku,用于爬取网页、玩转网页;
- 中规模,数据规模较大,爬取速度敏感,Scrapy库,用于爬取网站、爬去系列网站;
- 大规模,搜索引擎,爬取速度关键,定制开发,爬取全网
1.2 存在隐患
- 网络爬虫的“骚扰”
- 网络爬虫的法律风险
- 网络爬虫泄露隐私
1.3 网络爬虫的限制
- 来源审查:判断HTTP协议头的User-Agent域
- 发布公告:Robots协议,告知所有爬取网站的爬虫策略
2、Robots协议
全称:Robots Exclusion Standard 网络爬虫排除标准
作用:网站告知网络爬虫哪些页面可以抓取,哪些不行
形式:在网站根目录的robots.txt文件
Robot协议基本语法
# 注释,通配符 '*' 代表所有; '/' 代表根目录
User-agent:* # 指明针对哪些爬虫
Disallow:/ # 指明哪些目录不被允许
3、Robots的遵守方式
Robots协议的使用
网络爬虫:自动或人工识别robots.txt,再进行内容爬取
约束性:Robots协议是建议但非约束性的,可以不遵守,但存在法律风险
类人类行为(访问量很少)可以不参考Robots协议,但不能进行商业用途
单元3:Requests库网络爬虫实例
实例1:京东商品页面的提取
import requests
# 商品页面需要用户登录,改用京东首页
url = "https://www.jd.com/" # 网址,这里是京东首页的网址
try:
r=requests.get(url) # 访问
print(r.status_code) # 输出访问状态,200表示访问成功
print(r.encoding) # 查看页面的编码
print(r.apparent_encoding)
print(r.text[:1000]) # 打印页面信息
except:
print("爬取失败")
实例2:亚马逊商品页面的提取
import requests
url = "https://www.amazon.cn/gp/product/B01M8L5Z3Y" # 网址
try:
kv = {'User-Agent': 'Mozilla/5.0'} # 构建键值对,以改变HTTP协议的头部
r=requests.get(url,headers = kv) # 改变头文件进行访问
print(r.status_code) # 输出访问状态,200表示访问成功
r.raise_for_status() # 如果状态不是200,引发HTTPError异常
r.encoding = r.apparent_encoding # 改成便于阅读的编码
print(r.request.headers) # 查看HTTP协议的头部
print(r.text[:1000]) # 打印页面信息
except:
print("爬取失败")
实例3:百度360搜索关键词提交
'''
百度的关键词接口:
http://www,baidu.com/s?wd=keyword
360的关键词接口:
http://www.so.com/s?q=keyword
'''
import requests
url = "http://www.baidu.com/s" # 网址
keyword = 'python'
try:
kv = {'wd':keyword}
r = requests.get(url,params=kv) # 增加参数进行访问
print(r.request.url)
r.raise_for_status() # 如果状态不是200,引发HTTPError异常
r.encoding = r.apparent_encoding # 改成便于阅读的编码
print(len(r.text)) # 打印页面文本的长度
print(r.text[:1000]) # 打印页面信息
except:
print("爬取失败")
实例4:网络图片的爬取和存储
'''
网络图片链接的格式:
http://www.example.com/picture.jpg
'''
import requests
import os
url = "http://img0.dili360.com/ga/M00/46/FC/wKgBy1iv0WmAaXa1AE7LkZQs2kI077.tub.jpg" # 图片网址
root = "D:\\" # 保存在D盘
path = root + url.split('/')[-1] # split分段,提取图片的文件名
try:
if not os.path.exists(root):
os.mkdir(root)
if not os.path.exists(path):
r = requests.get(url) # 访问
with open(path,'wb') as f: # 打开文件
f.write(r.content) # 保存
f.close() # 关闭文件
print('文件保存成功')
else:
print('文件保存失败')
except:
print("爬取失败")
实例5:IP地址对属地的自动查询
'''
IP查询:www.ip138.com
提交IP后的链接:https://www.ip138.com/asp?ip=ipaddress
http://ip.webmasterhome.cn/?ip=202.204.80.112 中国站长之家IP查询地址
'''
import requests
url = "http://ip.webmasterhome.cn/?ip=" # ip查询网址前缀
ip = '202.204.80.112' # 查询ip
urlip = url+ip # ip查询链接
try:
r = requests.get(urlip)
print(r.status_code)
r.raise_for_status()
r.encoding = r.apparent_encoding
print(r.text[:-500])
except:
print("爬取失败")
测验1:PYTHON网络爬虫之规则(第一周)
# 1、Requests库中,下面哪个最可能是由于URL格式错误造成异常?
A、requests.URLRequired
B、requests.HTTPError
C、requests.TooManyRedirects
D、requests.ConnectionTimeout
正确答案 A
URL格式错误,一般指URL格式不符合规范导致无法建立连接,通常会产生URLRequired错误。如果URL格式正确,可能触发Timeout类错误。
# 2、在Requests库中,体现推送数据操作的函数是:
A、patch()
B、get()
C、head()
D、delete()
正确答案 A
数据推送(push model)一般指将数据发送出去的行为。
在Requests库中,post()、put()、patch()都体现这种行为模式。
# 3、在Requests库中,以下哪个函数是基础性函数?即,只需要一个函数即可完成全部功能。
A、get()
B、request()
C、post()
D、delete()
正确答案 B
request()是其他所有函数的基础函数,完成所有功能,其它函数只是它的一种封装形式。
# 4、以下选项不是Python Requests库提供方法的是:
A、.head()
B、.post()
C、.get()
D、.push()
正确答案 D
Requests库共有7个主要方法:request()、get()、head()、post()、put()、patch()、delete(),名字基本与HTTP的操作相同。
# 5、Requests库中,检查Response对象返回是否成功的状态属性是:
A、.headers
B、.status_code
C、.raise_for_status
D、.status
正确答案 B
r.status_code,200表示连接成功,404表示失败。
# 6、Requests库中,以下代表从服务器返回HTTP协议头所推荐编码方式的属性是:
A、.text
B、.apparent_encoding
C、.encoding
D、.headers
正确答案 C
.encoding是从HTTP header中猜测获得的响应内容编码方式。
# 7、Requests库中,以下代表从服务器返回HTTP协议内容部分猜测获得编码方式的属性是:
A、.encoding
B、.headers
C、.text
D、.apparent_encoding
正确答案 D
.apparent_encoding是从内容中分析出的编码方式,一般作为备选编码方式。
# 8、Requests库中,下面哪个是由于DNS查询失败造成的获取URL异常?
A、requests.HTTPError
B、requests.URLRequired
C、requests.ConnectionError
D、requests.Timeout
正确答案 C
DNS失败将造成网络连接错误,因此产生连接错误异常。
# 9、Requests库中的get()方法最常用,下面哪个说法正确?
A、HTTP协议中GET方法应用最广泛,所以,get()方法最常用。
B、网络爬虫主要进行信息获取,所以,get()方法最常用。
C、get()方法是其它方法的基础,所以最常用。
D、服务器因为安全原因对其他方法进行限制,所以,get()方法最常用。
正确答案 D
get()方法最常用的原因在于服务器端对push()、post()、patch()等数据推送的限制,试想,如果允许大家向服务器提交数据,将带来无穷无尽的安全隐患。因此,通过get()获取数据,服务器作为数据提供方而不是接收方,更为安全。
# 10、下面哪些功能网络爬虫做不到?
A、分析教务系统网络接口,用程序在网上抢最热门的课。
B、爬取网络公开的用户信息,并汇总出售。
C、持续关注某个人的微博或朋友圈,自动为新发布的内容点赞。
D、爬取某个人电脑中的数据和文件。
正确答案 D
个人电脑中数据没有联网且没有通过Web服务器以URL形式被网络访问,则不能用爬虫获取。
切记,及时能爬取数据,数据的知识产权仍然受保护,商业获利(出售)将涉嫌违法。
资料来源:
Python网络爬虫与信息提取_北京理工大学_中国大学MOOC(慕课) https://www.icourse163.org/course/BIT-1001870001