爬虫
爬虫基础(一些基本原理的梳理)
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.request
import urllib.error
import socket
try:
response = urllib.request.urlopen('https://www.httpbin.org/post',timeout=0.1)
except urllib.error.URLError as e:
if isinstance(e.reason, socket.timeout):
print
import urllib.request
request = 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_opener
from urllib.error import URLError
username = '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_opener
from urllib.error import URLError
proxy_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)
# 获取Cookie
import http.cookiejar,urllib.request
cookie = 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 …
看了这么久,结果跟我说这个库不好用,啊啊啊啊!!!!我服了