MOOC《Python网络爬虫和信息提取》(第11次)
网络爬虫之规则 21.07.14
学习目标
掌握定向网络爬取和页面解析的基本能力Requests库robots.txt 盗亦有道5个实战项目Projects单元1:Requests库入门
文章目录
网络爬虫之规则 21.07.14学习目标 单元1:Requests库入门1、pycharm安装:2、Requests库2.1 Requests库7个主要方法2.2 Response对象的属性2.3 编码方式 3、爬取网页的通用代码框架3.1 Requests库的异常3.2 爬取网页的通用代码框架 4、 HTTP协议HTTP协议对资源的操作 5、Requests库的主要方法解析6、练习 单元2:网络爬虫的盗亦有道1、网络爬虫引发的问题1.1网络爬虫的尺寸1.2 存在隐患1.3 网络爬虫的限制 2、Robots协议3、Robots的遵守方式 单元3:Requests库网络爬虫实例实例1:京东商品页面的提取实例2:亚马逊商品页面的提取实例3:百度360搜索关键词提交实例4:网络图片的爬取和存储实例5:IP地址对属地的自动查询 测验1:PYTHON网络爬虫之规则(第一周)1、pycharm安装:
打开设置->选择Project的Python interpreter->点击添加
输入requests->点击左下角install,等待片刻,安装完毕
验证安装成功:
import requestsr = requests.get("")var = r.status_code # 200print(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的GETrequests.head() # 获取HTML网页头信息的方法,对应于HTTP的HEADrequests.post() # 向HTML网页提交POST请求的方法,对应于HTTP的POSTrequests.put() # 向HTML网页提交PUT请求的方法,对应于HTTP的PUTrequests.patch() # 向HTML网页提交局部修改请求,对应于HTTP的PATCHrequests.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_codingr = requests.get("")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库的异常
3.2 爬取网页的通用代码框架
import requestsdef getHTMText (ur1) :try :r = requests.get (ur1, timeout=30)r.raise_for_status () #如果状态不是200,引发HTTPError异常r.encoding =r.apparent_encodingreturn r.textexcept:return "产生异常"if __name__ =="__main__":# url1 = ""url1 = ""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的七个方法相对应
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中的cookieauthor: 元组,支持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 requestsimport timedef getHTMLText(url):try:r = requests.get(url, timeout=30)r.raise_for_status() # 如果状态不是200,引发HTTPError异常r.encoding = r.apparent_encodingreturn Trueexcept:return "异常"if __name__ == "__main__":url = "/"# url = ""# url = "/"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_timeprint("爬取{}次网页使用时间:{:.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 = "/" # 网址,这里是京东首页的网址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 requestsurl = "/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,/s?wd=keyword360的关键词接口:/s?q=keyword'''import requestsurl = "/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:网络图片的爬取和存储
'''网络图片链接的格式:/picture.jpg'''import requestsimport osurl = "/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查询: 提交IP后的链接:/asp?ip=ipaddress/?ip=202.204.80.112 中国站长之家IP查询地址'''import requestsurl = "/?ip=" # ip查询网址前缀ip = '202.204.80.112' # 查询ipurlip = url+ip# ip查询链接try:r = requests.get(urlip)print(r.status_code)r.raise_for_status()r.encoding = r.apparent_encodingprint(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(慕课) /course/BIT-1001870001