1.http的请求方式:
get请求
优点:比较便捷
缺点:不安全、长度有限制
post请求
优点:比较安全、数据整体没有限制、可以上传文件
put
delete(删除一些信息)
发送网络请求(可以带一定的数据给服务器)
head(请求头)
Accept:文本格式
Accept-Encoding:编码格式
Connection:长链接/短链接
Cookie:缓存
Referer:表示从哪个页面跳转的
Uer-Agent:浏览器和用户信息
2.爬虫的分类:
通用爬虫:
使用搜索引擎:百度、谷歌、雅虎
优点:开放性、速度快
缺点:目标不明确
聚焦爬虫:(主要内容)
优点:目标明确、对用户的需求非常明确、返回的内容很固定
增量式: 翻页:从第一页请求到最后一页
Deep: 深度爬虫——静态数据 html和css
动态数据:js代码 加密js
robots: 是否允许其他爬虫(通用爬虫)进行爬取
3.爬虫的工作过程:
    1、确认爬取的目标网站
2、使用python(java/GO)代码发送请求获取数据
3、解析获取到的数据
获取新的目标(url)
递归第一步
爬自己想要的数据
4、数据持久化
python3(自带):
       · urllib.request
· urlopen:
· get传参
· post
· handle处理器的自定义
· urlError
  requests(第三方)
  
数据解析:xpath bs4
  数据存储
from urllib import request

def load_data():
url = "http://www.baidu.com/"
# 发送get的http请求
# respense: http相应的对象
response = request.urlopen(url)
# 读取内容 read()是bytes类型
data = response.read().decode()
# 将数据写入文件
with open('baidi.html', 'w', encoding='utf-8') as fp:
fp.write(data) # python爬取的类型
# 字符串类型 编码用encode
# bytes类型 解码用decode load_data()

使用urlopen获取网站

4、request传参的两种方式

  1. 使用字符串传参

from urllib import request, parse
import string def get_method_params():
# 目标字符串
# url = "https://www.baidu.com/s?wd=%E4%BD%A0%E5%A5%BD"
# 拼接字符串
url = "https://www.baidu.com/s?wd="
str_name = '你好'
# python 是解释性语言 只支持ASCII 0-127 不支持中文 final_url = url + str_name
print(final_url) # https://www.baidu.com/s?wd=你好
# 将包含汉字的网址进行转义
new_url = parse.quote(final_url, safe=string.printable)
print(new_url) # https://www.baidu.com/s?wd=%E4%BD%A0%E5%A5%BD # 发送网络请求
response = request.urlopen(new_url)
print(response.read().decode()) get_method_params()

使用parse解析带有中文的传参地址

  2. 使用字典传参
from urllib import request, parse

def get_params():
url = 'http://www.baidu.com/s?'
params = {
'wd': '你好',
} # urllib中封装的把字典型转化成字符串
str_params = parse.urlencode(params)
new_url = url + str_params response = request.urlopen(new_url)
content = response.read().decode()
print(content) get_params()

使用parse的urlencode字典传参

5、用urllib改变User-Agent和IP地址

如果频繁使用相同的User-Agent和IP,很有可能会被封。

因此,可以通过修改IP和User-Agent来继续爬取数据。

from urllib import request, parse

def load_baidu():
url = 'http://www.baidu.com'
# 添加请求头的信息
header = {
# 浏览器版本
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36'
} # 创建请求对象
req = request.Request(url, headers=header) response = request.urlopen(req) # 查看响应头
print(response.headers)
# 打印User-Agent
print(req.get_header('User-agent')) load_baidu()

查看User-Agent信息

from urllib import request
import random
def load_baidu():
url = 'https://www.baidu.com' user_agent_list = [
'Mozilla / 5.0(Windows NT 6.1;WOW64) AppleWebKit / 537.36(KHTML, likeGecko) Chrome / 39.0.2171.71Safari / 537.36',
'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11',
'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.133 Safari/534.16',
'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36',
]
# 选择不同的user-agent访问
random_user_agent = random.choice(user_agent_list) req = request.Request(url)
# 动态的增加相应头信息
req.add_header("User-Agent", random_user_agent) # 请求数据
response = request.urlopen(req)
print(req.get_header('User-agent')) load_baidu()

修改User-Agent的信息

from urllib import request

def create_proxy_handler():
url = 'https://www.cnblogs.com/1906859953Lucas/p/9027165.html' # 添加代理
proxy = {
"http": "47.94.57.119:80"
}
# 创建代理的处理器
proxy_handler = request.ProxyHandler(proxy)
# 创建opener
opener = request.build_opener(proxy_handler)
# 用代理IP发送请求
print(opener.open(url).read().decode()) create_proxy_handler()

修改IP地址

6、对带有cookie的请求进行爬取

对于需要登录的网页,需要提交cookie才能爬取到数据。

这时,要在headers中添加Cookie

其中,HTTP模块包含一些关于cookie的模块,可以自动使用cookie

  · CookieJar

    - 管理存储cookie,向传参的http请求添加cookie

    - cookie存储在内存中,CookieJar实例回收后cookie将消失

  · FileCookieJar

    - 使用文件管理cookie

    - filename是保存cookie的文件

from urllib import request

url = 'http://i.cnblogs.com/'

headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36',
'Cookie': '_ga=GA1.2.354663732.1553064338; __gads=ID=70555d8fa3a5e67c:T=1553064339:S=ALNI_Mbx26PA9IrbE68RrpzRjWAcJx2Gpg; _gid=GA1.2.1311232371.1554609564; .CNBlogsCookie=2AE31A6CAF7A1A36F741AAB3345858E1E900E0C2D13AF61C4F748D146073B7627E992D1AC628A98918787CE309A0C75175A9E7CC5661DCBCC813A5B79B337D260FD25F164440C00356EEFC079281CC9AD75067A7; .Cnblogs.AspNetCore.Cookies=CfDJ8JcopKY7yQlPr3eegllP76Nvjpfi50EnZRhyTBGZTMAsFzhKQhymiEKK3Tef6eB-cDHAebfBmKaqf6nDbSKSYHRFtWueRRdH-h5h62lO3KA0XTcHio2I8X-yiqMvIN3tq59NLHAZpnbmeQ9gfpAdmVqowdjtauYklDJGRBArG21wtRhpXrO5siBPD6uBO366GHYtSEqKN2KHbeOu01Sj6fpaBRQrK7SLABHv5uYJZhHstUqfbFdbTTX0IV_UFZKJqrQ3H_BrhgcQkpRGuRh-1CFK2wDdVqAJFA77QpHTGKYtvW0gJqSD4Lp9MARGcRMxfQ; SERVERID=04ead23841720026ba009cb4f597ec8c|1554690895|1554690169'
} req = request.Request(url, headers=headers)
response = request.urlopen(req)
data = response.read() # 保存到文件中,验证数据
with open('01cook.html', 'wb') as fp:
fp.write(data)

Cookie认证

from urllib import request, parse
from http import cookiejar
"""
获取“个人中心”页面
1、用代码登录
2、自动带着cookie 去请求个人中心
""" # 代码登录步骤:
# 1 登录的网址
# 2 登录的参数
# 3.发送登录请求
url = 'http://iclass.ncut.edu.cn/iclass/'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36',
'Cookie': 'javascriptEnabled=true; LOGIN=3137313539303130323235; SCREEN_NAME=566d3857595565766e456c3645644d5a44486a4b64513d3d; 0ca7f72ea52b0a619ac85f97d67c3401=0mj8s9v7flnaeta7a40pk2dau2',
} # 利用cookiejar自动保存cookie
login_form_data = {
'login': '',
'password': '******',
}
# 发送登录请求POST
cook_jar = cookiejar.CookieJar()
# 定义处理器
cook_handler = request.HTTPCookieProcessor(cook_jar)
# 根据处理器生成opener
opener = request.build_opener(cook_handler) # 带着参数 发送post请求
login_request = request.Request(url, headers=headers, data=parse.urlencode(login_form_data).encode('utf-8'))
opener.open(login_request) center_url = 'http://iclass.ncut.edu.cn/iclass/'
center_request = request.Request(center_url, headers=headers)
response = opener.open(center_url)
data = response.read() # 保存到文件中,验证数据
with open('02cook.html', 'wb') as f:
f.write(data)

实现登录功能

7、报错的问题
from urllib import request, error

url = 'https://home.cnblogs.com/gg/'
try:
response = request.urlopen(url)
print(response.read().decode())
except error.HTTPError as e:
print(e)
except error.URLError as e:
print(e)
except Exception as e:
print(e)

HTMLError和URLError


001 爬虫的基本概念以及urllib的request和parse的更多相关文章

  1. 【Python爬虫】HTTP基础和urllib库、requests库的使用

    引言: 一个网络爬虫的编写主要可以分为三个部分: 1.获取网页 2.提取信息 3.分析信息 本文主要介绍第一部分,如何用Python内置的库urllib和第三方库requests库来完成网页的获取.阅 ...

  2. 小白学 Python 爬虫(13):urllib 基础使用(三)

    人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...

  3. 小白学 Python 爬虫(15):urllib 基础使用(五)

    人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...

  4. Python爬虫(2):urllib库

    爬虫常用库urllib 注:运行环境为PyCharm urllib是Python3内置的HTTP请求库 urllib.request:请求模块 urllib.error:异常处理模块 urllib.p ...

  5. 潭州课堂25班:Ph201805201 爬虫基础 第三课 urllib (课堂笔记)

    Python网络请求urllib和urllib3详解   urllib是Python中请求url连接的官方标准库,在Python2中主要为urllib和urllib2,在Python3中整合成了url ...

  6. 爬虫入门【1】urllib.request库用法简介

    urlopen方法 打开指定的URL urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, ca ...

  7. python爬虫---从零开始(二)Urllib库

    接上文再继续我们的爬虫,这次我们来述说Urllib库 1,什么是Urllib库 Urllib库是python内置的HTTP请求库 urllib.request 请求模块 urllib.error 异常 ...

  8. 爬虫基本库的使用---urllib库

    使用urllib---Python内置的HTTP请求模块 urllib包含模块:request模块.error模块.parse模块.robotparser模块 发送请求 使用 urllib 的 req ...

  9. 小白学 Python 爬虫(12):urllib 基础使用(二)

    人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...

随机推荐

  1. 10-PI开发手册-ERP发布服务供外围系统调用(RFC类型)

      一.      文档信息 版本号* 更新日期* 姓名* 更新内容及更新理由* 备注* V1.0 2019/02/19 fanjb 文档创建 以福利接口13589(Z00HRJ_GJJ_REV_FI ...

  2. Cnario Player 接入视频采集卡采集外部音视频信号测试

    测试产品 型号: TC-D56N1-30P采集卡 参数: 1* HDMI 1.4输入, PCIe 接口为PCI-Express x4(Gen2), 最高支持4096x2160@30Hz, 支持1920 ...

  3. ansible 模块 分享

    A a10_server 管理A10 Networks AX / SoftAX / Thunder / vThunder设备 a10_service_group 管理A10网络设备的服务组 a10_v ...

  4. AtCoder ABC 042D いろはちゃんとマス目 / Iroha and a Grid

    题目链接:https://abc042.contest.atcoder.jp/tasks/arc058_b 题目大意: 给定一个 H * W 的矩阵,其中左下角 A * B 区域是禁区,要求在不踏入禁 ...

  5. golang文件操作

    一.读写文件 1.读文件操作 os.File 封装所有文件相关操作 例子: package main import ( "fmt" "os" "io/ ...

  6. ABP拦截器之AuthorizationInterceptor

    在整体介绍这个部分之前,如果对ABP中的权限控制还没有一个很明确的认知,请先阅读这篇文章,然后在读下面的内容. AuthorizationInterceptor看这个名字我们就知道这个拦截器拦截用户一 ...

  7. List、Map、Set之间的联系与区别:

    一.数组和集合的区别: 1.数组的大小是固定的,并且同一个数组只能是相同的数据类型 2.集合的大小是不固定的,在不知道会有多少数据的情况下可使用集合. 二.集合的三种类型:list(列表).set(集 ...

  8. 「Algospot」龙曲线DRAGON

    一道考验思维的好题,顺便总结求第k大问题的常规思路: 传送门:$>here<$ 题意 给出初始串FX,每分形一次所有X替换为X+YF,所有Y替换为FX-Y.问$n$代字符串第$p$位起长度 ...

  9. 主成分分析_PCA解释

    粘贴自:http://blog.codinglabs.org/articles/pca-tutorial.html 数据的向量表示及降维问题 向量的表示及基变换 协方差矩阵及优化目标 协方差矩阵对角化 ...

  10. Linux系统下rm删除文件后空间没有释放问题解决办法

    一.问题描述 今日收到zabbix监控报警,发现生产环境一台服务器的磁盘空间不足,需要进行处理,登录后发现可利用率不足20%,进行相关查看和处理工作:但是操作删除了一些备份文件和日志信息后,查看空间仍 ...