Python网络爬虫与信息提取(北京理工大学慕课)学习笔记1

Python网络爬虫与信息提取(基础篇一)

    • Requests库入门
        • Requests库的7个主要方法
            • requests.get()
        • Response对象
            • Response对象的属性
        • 爬取网页的通用代码框架
        • HTTP协议
        • Requests库主要方法解析
            • request()
            • 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)
    • 网络爬虫的“盗亦有道”
        • 网络爬虫的尺寸
        • 网络爬虫的限制
        • Robots协议
        • Robots协议的遵守
    • Requests库网络爬虫实战
        • 京东商品页面爬取
        • 亚马逊商品爬取
        • 百度/360搜索关键词提交
        • 网络图片的爬取和存储
        • IP地址归属地的自动查询

Requests库入门

安装requests库

pip install requests

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
requests.get()

r=requests.get(url)
构造一个向服务器请求资源的Request对象,返回一个包含服务器资源的Response对象

get方法的完整版:
requests.get(url,params=None,**kwargs)
url:拟获取页面的url链接
params:url中的额外参数,字典或字节流格式,可选
**kwargs:12个控制访问的参数

get方法源代码:

request方法是基础

Response对象

>>> import requests
>>> r=requests.get("http://www.baidu.com")
>>> print(r.status_code)
200		#状态码为200,则访问成功
>>> type(r)
<class 'requests.models.Response'>
>>> r.headers
{'Cache-Control': 'private, no-cache, no-store, proxy-revalidate, no-transform', 'Connection': 'keep-alive', 'Content-Encoding': 'gzip', 'Content-Type': 'text/html', 'Date': 'Sat, 18 Apr 2020 08:11:18 GMT', 'Last-Modified': 'Mon, 23 Jan 2017 13:27:52 GMT', 'Pragma': 'no-cache', 'Server': 'bfe/1.0.8.18', 'Set-Cookie': 'BDORZ=27315; max-age=86400; domain=.baidu.com; path=/', 'Transfer-Encoding': 'chunked'}
Response对象的属性
属性 说明
r.status_code HTTP请求的返回状态,200表示链接成功,404表示失败
r.text HTTP相应内容的字符串形式,即url对应的页面内容
r.encoding 从HTTP header中猜测的相应内容编码方式
r.apparent_encoding 从内容中分析出的相应内容编码方式(备选编码方式)
r.content HTTP相应内容的二进制形式
>>> import requests
>>> r=requests.get("http://www.baidu.com")
>>> r.status_code
200
>>> r.text
'\r\n ç\x99¾åº¦ä¸\x80ä¸\x8bï¼\x8cä½\xa0å°±ç\x9f¥é\x81\x93  
\r\n'
>>> r.encoding 'ISO-8859-1' >>> r.apparent_encoding 'utf-8' >>> r.encoding="utf-8" >>> r.text '\r\n 百度一下,你就知道

关于百度 About Baidu

©2017 Baidu 使用百度前必读  意见反馈 京ICP证030173号 

\r\n'

r.encoding: 如果header中不存在charset,则认为编码为ISO-8859-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

通用代码框架:

import requests
def getHTMLText(url):
    try:
        r = requests.get(url,timeout = 30)
        r.raise_for_status() #如果状态不是200,引发HTTPError异常
        r.encoding = r.apparent_encoding
        return r.text
    except:
        return "产生异常"
 
 
if __name__ == "__main__":
    url = "http://www.baidu.com"
    print(getHTMLText(url))

HTTP协议

HTTP,hypertext transfer protocol,超文本传输协议
HTTP是一个基于“请求与响应”模式的、无状态的应用层协议
用户发起请求,服务器做出响应。
HTTP协议采用URL作为定位网络资源的标识
URL格式 : http://host[:port][path]
host:合法的Internet主机域名或IP地址
port:端口号,缺省端口为80
path:请求资源的路径
URL是通过HTTP协议存取资源的Internet路径,一个URL对应一个数据资源
HTTP协议对资源的操作

方法 说明
GET 请求获取URL位置的资源
HEAD 请求获取URL位置资源的响应消息报告,即获得该资源的头部信息
POST 请求向URL位置的资源后附加新的数据
PUT 请求向URL位置存储一个资源,覆盖原URL位置的资源
PATCH 请求局部更新URL位置的资源,即改变该处资源的部分内容
DELETE 请求删除URL位置存储的资源

网络通道和服务器都是黑盒子,所能看到的只是URL链接以及对URL的操作
PATCH和PUT相比较,PATCH可以节省网络带宽(只更改局部)
Python网络爬虫与信息提取(北京理工大学慕课)学习笔记1_第1张图片
向URL POST一个字典,自动编码为form(表单)
Python网络爬虫与信息提取(北京理工大学慕课)学习笔记1_第2张图片
向URL POST一个字符串,自动编码为data
Python网络爬虫与信息提取(北京理工大学慕课)学习笔记1_第3张图片

Requests库主要方法解析

request()

request()方法是基础
Python网络爬虫与信息提取(北京理工大学慕课)学习笔记1_第4张图片
Python网络爬虫与信息提取(北京理工大学慕课)学习笔记1_第5张图片
Python网络爬虫与信息提取(北京理工大学慕课)学习笔记1_第6张图片
Python网络爬虫与信息提取(北京理工大学慕课)学习笔记1_第7张图片
json格式在HTTP,HTML相关的web开发中最常使用
Python网络爬虫与信息提取(北京理工大学慕课)学习笔记1_第8张图片
Python网络爬虫与信息提取(北京理工大学慕课)学习笔记1_第9张图片
Python网络爬虫与信息提取(北京理工大学慕课)学习笔记1_第10张图片
Python网络爬虫与信息提取(北京理工大学慕课)学习笔记1_第11张图片
若在timeout规定时间内没有返回,则抛出一个timeout异常
Python网络爬虫与信息提取(北京理工大学慕课)学习笔记1_第12张图片
隐藏用户爬取网页时的原ip地址,防止对爬虫的逆追踪
Python网络爬虫与信息提取(北京理工大学慕课)学习笔记1_第13张图片

requests.get(url,params=None,**kwargs)

url:拟获取页面的url链接
params:url中的额外参数,字典或字节流格式,可选
**kwargs:12个控制访问的参数

requests.head(url,**kwargs)

url:拟获取页面的url链接
**kwargs:13个控制访问的参数

requests.post(url,data=None,json=None,**kwargs)

url:拟更新页面的url链接
data:字典、字节序列或文件,Request的内容
json:JSON格式的数据,Request的内容
**kwargs:11个控制访问的参数

requests.put(url,data=None,**kwargs)

url:拟更新页面的url链接
data:字典、字节序列或文件,Request的内容
**kwargs:12个控制访问的参数

requests.patch(url,data=None,**kwargs)

url:拟更新页面的url链接
data:字典、字节序列或文件,Request的内容
**kwargs:12个控制访问的参数

requests.delete(url,**kwargs)

url:拟删除页面的url链接
**kwargs:13个控制访问的参数

最常用的就是get()方法,其次是head()方法
若url资源非常大,就使用head方法获取头部信息概要

网络爬虫的“盗亦有道”

网络爬虫的尺寸

1.小规模,数据量小,爬取速度不敏感,使用Requests库(爬取网页)
2.中规模,数据规模较大,爬取速度敏感,使用Scrapy库(爬取网站)
3.大规模,搜索引擎,爬取速度关键,定制开发(爬取全网)

网络爬虫会为web服务器带来巨大的资源开销

网络爬虫的限制

来源审查:判断User-Agent进行限制(检查来访HTTP协议头的User-Agent域,只响应浏览器或友好爬虫的访问)
发布公告:Robots协议(告知所有爬虫网站的爬取策略,要求爬虫遵守)

Robots协议

robots exclusion standard 网络爬虫排除标准
作用:网站告知网络爬虫哪些页面可以抓取,哪些不行
形式:在网站根目录下的robots.txt文件

Robots协议基本语法:

#注释,*代表所有,/代表根目录
User-agent: *
Disallow: /

若一个网站无Robots协议,则所有爬虫都可以爬取

Robots协议的遵守

网络爬虫:自动或人工识别robots.txt,再进行内容爬取
约束性:Robots协议是建议但非约束性,网络爬虫可以不遵守但存在法律风险
类人行为可不参考Robots协议

Requests库网络爬虫实战

京东商品页面爬取

课程全代码:

import requests
url="http://item.jd.com/2967929.html"
try:
	r=requests.get(url)
	r.raise_for_status()
	r.encoding=r.apparent_encoding
	print(r.text[:1000])
except:
	print("爬取失败")

但其实自己运行跑的时候发现获取到的信息是京东的用户登录界面。。。

亚马逊商品爬取

爬取时获取意外错误(API造成)
在r.request.headers中,User-Agent值为’python-requests/2.22.0’
更改User-Agent 使爬虫程序模拟浏览器访问

kv = {'user-agent':'Mozilla/5.0'}
url = "https://www.amazon.cn/gp/product/B01M8L5Z3Y"
r = requests.get(url,headers=kv)
print(r.status_code) #变成200了

全代码:

import requests
url = "https://www.amazon.cn/gp/product/B01M8L5Z3Y"
try:
    kv = {'user-agent':'Mozilla/5.0'}
    r = requests.get(url,headers=kv)
    r.raise_for_status()
    r.encoding = r.apparent_encoding
    print(r.text[1000:2000])
except:
    print("爬取失败")

跑的时候发现还是会有api的问题(可能亚马逊的审查机制又更新了吧)

百度/360搜索关键词提交

搜索引擎关键词提交接口:

百度的关键词接口:
http://www.baidu.com/s?wd=keyword
360的关键词接口:
http://www.so.com/s?q=keyword

>>> import requests
>>> kv={'wd':'Python'}
>>> r=requests.get("http://www.baidu.com/s",params=kv)
>>> r.status_code
200
>>> r.request.url
'https://wappass.baidu.com/static/captcha/tuxing.html?&ak=c27bbc89afca0463650ac9bde68ebe06&backurl=https%3A%2F%2Fwww.baidu.com%2Fs%3Fwd%3DPython&logid=8627790867845123754&signature=8c6cf7300c8bb315f6f358e46dbd00a5×tamp=1587210680'
>>> len(r.text)
1519

全代码:

import requests
keyword = "Python"
try:
    kv = {'wd': keyword}
    r = requests.get("http://www.baidu.com/s", params=kv)
    print(r.request.url)
    r.raise_for_status()
    print(len(r.text))
except:
    print("爬取失败")

网络图片的爬取和存储

网络上图片链接的格式

http://www.example.com/picture.jpg

>>> import requests
>>> path="D:/abc.jpg"
>>> url="http://image.nationalgeographic.com.cn/2017/0211/20170211061910157.jpg"
>>> r= requests.get(url)
>>> r.status_code
200
>>> with open(path,'wb')as f:
...    f.write(r.content)#将图片以二进制编码信息写入文件中
...
228206
>>> f.close()

全代码:

import requests
import os
url = "http://image.nationalgeographic.com.cn/2017/0211/20170211061910157.jpg"
root = "D://pics//"
path = root+url.split('/')[-1]
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("爬取失败")

IP地址归属地的自动查询

在IP138网站上查询
接口形式为:

http://m.ip138.com/ip=ipaddress

你可能感兴趣的:(学习笔记)