爬虫
爬虫基础(一些基本原理的梳理)
scheme://[username:password@]hostname[:port][/path][;parameters][?query][#fragment]
注: parameters 和 query 混用,并且现在 query 用的多
- ?query 查询 ,用来查询某类资源,如果有多个查询,则用&隔开
https://www.baidu&ie=utf-8
-
fragment 片段 ,对资源描述的部分补充
-
两个作用,Vue 和 React 都可以借助它来做路由管理/ 另外一个作用:用作HTML锚点
HTTP 下 加入 SSL 层 简称 HTTPS
SSL的主要作用
-
建立一个安全通道,保证数据传输的安全性
-
确认网站的真实性
网络相关的书籍 《计算机网络》 《图解HTTP》
-
响应头
-
Date:用于标识响应产生的时间
-
Last-mModified:用于指定资源的最后修改时间
-
Content-Encoding:用于指定响应内容的编码
-
Serve:博阿寒服务器的信息,例如名称,版本号
-
Content-Type:文档类型,指定返回的数据是什么类型
-
text/html 返回HTML
-
application/x-javascript 返回 js
-
image/jpeg 返回图片
-
-
Set-Cookie:设置Cookie,响应头中的Set-Cookie用于告诉浏览器需要将此内容放在Cookie中,下次请求时将Cookie携带上
-
Expires:用于指定响应的国企时间,可以让代理服务器活浏览器将加载的内容更新到缓存中,当再次访问相同的内容时,就可以直接从缓存中加载,达到降低服务器负载,缩短加载时间的目的
-
css选择器
-
要是各个选择器之间不加空格,则代表并列关系
-
div#container .wrapper
-
选择的是 id为container 的 div 元素内部的class为wrapper的元素
-
爬虫概述:爬虫就是获取页面并提取和保存信息的自动化程序
Cookie和Session:Cookie和Session需要配合,一个在客户端,一个在服务端,二者共同协作,就实现了登录控制
代理:对于爬虫来说,使用代理就是为了隐藏自身IP,防止自身的IP被封锁
进程:可以理解为一个可以独立运行的程序单位
线程:是进程中的一个任务
线程是操作系统进行运算调度的最小单位,是经常中的最小运行单位
并发:宏观看起来是同时运行
并行:宏观和微观都是同时运行
基本库的使用
Request类和urlopen类相当于类库已经封装号的极其常用的请求方法
最基础的HTTP库
-
urllib
-
request (最基本的HTTP请求模块,只需url 和 额外参数)
-
urlopen() ----> 是一个类
-
data(参数) —> 要使用bytes方法将参数转换为字节流编码格式的内容,如果传递这个参数,它的请求方式将变成POST
-
timeout(参数)
-
url (参数,必填)
-
-
Request -------> 是一个类
-
url(参数,必填)
-
data(参数,必须传bytes类型的,如果是字典,先用urllib.parse中的urlencode方法进行编码)
-
headers (参数,是一个字典,可以通过headers参数直接构造此项,也可以通过调用请求实例的 add_header 方法添加)
-
origin-req-host(参数,指的是请求方的host名称或者IP地址)
-
method(参数,字符串参数,“GET”,“POST”…等)
-
-
-
reeor
-
parse
- 一个工具模块,提供了URL的处理方法,例如拆分,解析,合并
-
# 对于data数据的处理data = bytes(urllib.parse.urlencode({name':'germy'},encoding='utf-8')response = urllib.request.urlopen('url',data=data)print(response.read().decode('utf-8'))# timeout 和 reeor 的配合使用import urllib.requestimport urllib.errorimport sockettry:response = urllib.request.urlopen('https://www.httpbin.org/post',timeout=0.1)except urllib.error.URLError as e:if isinstance(e.reason, socket.timeout):printimport urllib.requestrequest = urllib.request.Request('url')response = urllib.request.urlopen(request)# 此时urlopen的参数是Request类型的对象print(response.read().decode('utf-8'))# 使用Request类来发请求url = 'http://www.httpbin.org/post'headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36 Edg/135.0.0.0','Host':'www.httpbin.org'}dict = { 'name':'Germey'}data = bytes(urllib.parse.urlencode(dict), encoding='utf-8')req = request.Request(url, data, headers, method='POST')response = request.urlopen(req)print(response.read().decode('utf-8'))
高级用法
-
urllib.request 模块里的 BaseHandler 类,这是其他所有 HandLer 类的父类,提供了最基本的方法,default_openmprotocol_request
-
HTTPDefaultErroeHandler
- 用于处理HTTP响应错误,所有错误都会抛出HTTPError类的错误
-
HTTPRedirectHandler
- 处理重定向
-
HTTPCookieProcessor
- 处理Cookie
-
ProxyHandler
- 设置代理,默认为空
-
HTTPPasswordMgr
- 用于管理密码
-
-
Opener类 ------> 帮助我们深入一层进行配置
- 利用Handler类构建Opener类
# 验证from urllib.request import HTTPPasswordMgrWithDefaultRealm, HTTPBasicAuthHandler, build_openerfrom urllib.error import URLErrorusername = 'admin'password = 'admin'url = 'https://ssr3.scrape.center/'p = HTTPPasswordMgrWithDefaultRealm()p.add_password(None, url, username, password)auth_handler = HTTPBasicAuthHandler(p)opener = build_opener(auth_handler)try:result = opener.open(url)html = result.read().decode('utf-8')print(html)except URLError as e:print(e.reason)#设置代理from urllib.request import urlopen, ProxyHandler, build_openerfrom urllib.error import URLErrorproxy_handler = ProxyHandler({'http':'http://127.0.0.1:1080','https':'https://127.0.0.1:1080'})opener = build_opener(proxy_handler)try:response = opener.open('http://www.baidu.com')print(response.read())except URLError as e:print(e.reason)# 获取Cookieimport http.cookiejar,urllib.requestcookie = http.cookiejar.CookieJar()handler = urllib.request.HTTPCookieProcessor(cookie)opener = urllib.request.build_opener(handler)response = opener.open('http://www.baidu.com')for item in cookie:print(item.name + '=' + item.value)
handler配置好,然后用Opener类打开
- 异常处理
以上当了解就好 urllib …
看了这么久,结果跟我说这个库不好用,啊啊啊啊!!!!我服了