MOOC《Python网络爬虫和信息提取》(第11次)网络爬虫之规则 (第1周)

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.HTTPErrorHTTP错误异常
requests.URLRequiredURL缺失异常
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个

  1. params:字典或字节序列,作为参数增加到url中
  2. data: 字典、字节序列或文件对象,作为Request的内容
  3. json: JSON格式的数据,作为Request的内容
  4. headers:字典,HTTP定制头
  5. cookies:字典或CookieJar,Request中的cookie
  6. author: 元组,支持HTTP认证功能
  7. file: 字典类型,传输文件
  8. timeout:设定超时时间,秒为单位
  9. proxies:字典类型,设定访问代理服务其,可以增加登录认证
  10. allow_redirects: True/False,默认为True,重定向开关,表示允不允许对URL进行重定向
  11. stream: True/False,默认为True,获取内容立即下载开关(默认下载)
  12. verify: True/False,默认为True,认证SSL证书开关
  13. 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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值