【Python爬虫原理与基本请求库urllib详解】

news2024/10/5 5:25:17

Python爬虫原理与基本请求库urllib详解

这篇文章主要介绍了Python爬虫原理与基本请求库urllib详解,爬虫就是通过模拟浏览器,按照一定的规则,自动、大批量的获取网络资源,包括文本、图片、链接、音频、视频等等,需要的朋友可以参考下

文章目录

  • Python爬虫原理与基本请求库urllib详解
    • 一、网络爬虫是什么?
    • 二、爬虫原理
    • 三、基本请求库urllib
      • 1、用urllib抓取网页的【基本语法】
      • 2. 抓取需要输入【关键词】的网页
      • 3. 抓取需要【登录密码】的网页
        • **3.1 基础操作**
        • **3.2 设置cookie**
      • 4. 抓取【反爬机制】的网页
        • **4.1 设置headers**
        • **4.2 设置proxy**
      • 5. urllib异常处理

一、网络爬虫是什么?

爬虫的定义请求网站,并提取数据的自动化程序。

通过模拟浏览器,按照一定的规则,自动、大批量的获取网络资源,包括文本、图片、链接、音频、视频等等。

二、爬虫原理

(讲的就是如何获取网络资源的问题—怎么爬?要有尊严的爬,坐着就把数据优雅的爬下来)

1、发起请求:模拟浏览器向目标站点发送一个request,等待服务器响应;

2、获取响应内容:如果服务器能正常响应,会返回一个response,这便是所要获取的页面内容

3、解析内容:根据自己的需求,通过各种解析方法,将得到的内容进行解析

4、保存数据:存放于数据库或者保存为特定格式的文件

所以接下来本次我们要学习的内容就是以上这四个步骤了。

三、基本请求库urllib

这个库的作用呢,就是爬虫原理中的第一、二步,向目标网站发送请求用的。

本节内容:

  1. 用urllib抓取网页的基本语法
  2. 抓取需要输入关键词的网页
  3. 抓取需要登录密码的网页
  4. 抓取反爬机制的网页
  5. urllib异常处理

1、用urllib抓取网页的【基本语法】

有两种方法,一种是直接抓取,一种是直接将目标网址的网页信息保存到本地。

#无论哪种方法,先导包
import urllib.request
  • 方法一:(常用) urllib.request.urlopen(url, data, timeout) 发送请求直接抓取
'''
urllib.request.urlopen(url, data, timeout) 发送request请求(3个参数不需都写,但必须有url)
url:目标网址
data:访问url时发送的数据包,默认为null
timeout:等待时长
'''
response = urllib.request.urlopen('http://www.baidu.com/')
# decode():解码,将字节流格式数据以相应的形式转化为字符串
print(response.read().decode('utf-8'))

通过urllib请求后得到的response打印如下:<http.client.HTTPResponse object at 0x000001DA07919608> 所以要先read()读取出来,但是给我的页面都是字节流数据,所以我们要在该网页源代码中找到其chartset,比如百度首页的编码格式就是utf-8,所以发送请求后,要拿到我们可读的网页就需要先read()再decode()解码。 具体如何找到目标网页的编码格式如下图:

在这里插入图片描述

  • 方法二urllib.request.urlretrieve(url,filename) 将目标网址网页信息保存到本地
'''
urllib.request.urlretrieve(url,filename) 直接将目标网址的网页信息保存到本地
filename:想保存到的路径文件名
然后用urllib.request.urlcleanup()清除缓存
'''
filename = urllib.request.urlretrieve('http://www.baidu.com/',filename='baidu.html')
urllib.request.urlcleanup()

2. 抓取需要输入【关键词】的网页

背景:我想爬取目标网页上支持搜索关键词的网页所有相关信息,比如我想爬百度上所有python的信息,或者疫情的信息,或者其它的信息,如果每次都更换url那就太低效了。 分析网页url:目标网页是百度,//www.baidu.com/,输入python之后url有变化,发现//www.baidu.com/s?wd=python这个网址也能搜索到python的信息,找到规律,//www.baidu.com/s?wd=后面的词可以替换成任何词,都支持搜索,那么我们可以把这个词用input来输入得到,然后对url做一个拼接。 注意:发现//www.baidu.com/s?wd=后面的词不支持中文搜索,原因是网址中都是字节流的数据,所以如果我们要输入中文搜索的话,要将中文转为字节流格式

# 定义关键词
keyword = input('输入你想查询的关键词:')
# 处理中文,进行编码,转成字节流格式
keyword = urllib.request.quote(keyword)
# url重构
url = 'http://www.baidu.com/s?wd='+keyword
response = urllib.request.urlopen(url).read()
# 保存到本地
f = open('baidu_search.html','wb') #wb存储字节流数据,所以上述response不需要用decode解码
f.write(response)
f.close()

3. 抓取需要【登录密码】的网页

背景:需要爬取用户登录之后页面的数据, 这里有一个url供大家练习://www.iqianyue.com/mypost/ 该网页输入任何用户名和密码都能成功登录,下图为登录后的页面,也就是我们这次通过写程序要爬取的结果页面。

在这里插入图片描述

还记得urllib的基本语法吗?里面有3个参数,第二个是data,也就是我们传入的值,这里可以把用户名和密码跟着页面请求一起发送过去,但是要怎么做呢?首先要找到网页代码里是怎么设置用户名和密码的命名的(也就是字典里的key值)。

在这里插入图片描述

3.1 基础操作
import urllib.request
import urllib.parse #上传用户名和密码,需要先用parse模块进行编码处理
url = 'https://www.iqianyue.com/mypost/'
# urlencode():将上传的数据进行编码处理
# encode():将字符串转化为相应编码的字节流数据
postdata = urllib.parse.urlencode({
    'name':'vicky',
    'pass':'12345'
}).encode('utf-8')
response = urllib.request.urlopen(url,data=postdata).read()
# 保存网页
f = open('post.html','wb')
f.write(response)
f.close()

运行成功后将post.html文件打开,鼠标点进去后右上角会显示各种浏览器,选择各自使用的浏览器打开页面,就会发现,出现的页面就是登录成功后的页面,跟上图一致。

3.2 设置cookie

背景:通过上述常规方法,可以模拟登录页面抓取该目标页面的资源,但也存在一种情况,这一步执行成功后,后续如果想抓取该网站的其它网页,用程序登录进去之后依然是无登录状态,浏览器并没有留下cookie。

【举个栗子】:

import urllib.request
import urllib.parse
# 主页面:'http://blog.chinaunix.net/'
# 登录页面:'http://account.chinaunix.net/login?url=http%3a%2f%2fblog.chinaunix.net'
# 登录跳转页面:'http://account.chinaunix.net/login/sso?url=http%3A%2F%2Fblog.chinaunix.net'
url = 'http://account.chinaunix.net/login/sso?url=http%3A%2F%2Fblog.chinaunix.net'
postdata = urllib.parse.urlencode({
    'username':'***',
    'password':'******'
}).encode('utf-8')
response = urllib.request.urlopen(url,postdata).read()
f = open('chinaunix.html','wb')
f.write(response)
f.close()

拿这个网站举例,我选的url是登录跳转时的页面,顺利跳转后就进入到首页,如果我后续再写一个请求,直接访问该首页,登录进去发现还是无登录状态。 那么那么那么那么那么…

解决方案;

1、导入cookie处理模块 http.cookiejar

2、使用http.cookiejar.CookieJar()创建cookiejar对象

3、使用HTTPCookieProcessor创建cookie处理器,并以此为参数构建opener对象

4、加载为全局默认的opener

这样写,就把cookie贯穿整个网站的始终了,访问哪个页面都是登录状态。

import urllib.request
import urllib.parse
import http.cookiejar
url = 'http://account.chinaunix.net/login/sso?url=http%3A%2F%2Fblog.chinaunix.net'
postdata = urllib.parse.urlencode({
    'username':'***',
    'password':'***'
}).encode('utf-8')
response = urllib.request.urlopen(url,postdata).read()
# 创建cookiejar对象
cjar = http.cookiejar.CookieJar()
# 创建cookie处理器,并以此为参数构建opener对象
opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cjar))
# 加载为全局默认的opener
urllib.request.install_opener(opener)
f = open('chinaunix_2.html','wb')
f.write(response)
f.close()

4. 抓取【反爬机制】的网页

背景:因为有些网站也有一些反爬机制,所以你用上述语法进行常规的发送请求之后不一定能得到响应,,下面就讲述遇到反爬的网站我们应该怎么做。

对于反爬网页的对策有2点: headers:设置头部信息,将爬虫伪装成浏览器 proxy:设置代理,使用代理服务器并经常切换代理服务器

4.1 设置headers

— headers信息也在网页源代码中,找到User-Agent(headers里一般设置这个就行了),构建字典,把:后面的系统浏览器版本等信息全部复制粘贴进来,模拟浏览器登录。

— 发送请求前,要先构建一个Request请求对象,设置headers,再把请求对象传到urlopen中

import urllib.request
url = 'http://t.dianping.com/hangzhou'
# 构建headers
h = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36'
}
# 构建Request请求对象
request = urllib.request.Request(url=url, headers=h)
response = urllib.request.urlopen(request).read()
# 保存文件
f = open('headers.html','wb')
f.write(response)
f.close()
4.2 设置proxy

也就是代理IP,在一定时间内频繁爬取某个网页可能会被封,所以可以使用一些代理IP来爬取资源。

import urllib.request
def use_Proxy(proxy_addr,url):
    # ProxyHandler()设置对应的代理服务器信息
    proxy = urllib.request.ProxyHandler({'http':proxy_addr})
    # build_opener()创建一个自定义的opener对象
    opener = urllib.request.build_opener(proxy)
    # 将opener加载为全局使用的opener
    urllib.request.install_opener(opener)
    response = urllib.request.urlopen(url).read().decode('utf-8')
    return response
proxy_addr = '183.146.213.157:80'  # IP地址:端口号  自行百度“代理IP”
url = 'http://www.taobao.com'
print(len(use_Proxy(proxy_addr,url)))  #随便打印一个长度,看看这个代理IP能否使用

5. urllib异常处理

建立异常处理机制,反馈出错原因。

import urllib.request
import urllib.error
try:
    response = urllib.request.urlopen('http://www.ijinqian.com')
except urllib.error.URLError as e:
    print('发生异常--->'+str(e))

到此这篇关于Python爬虫原理与基本请求库urllib详解的文章就介绍到这了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1085481.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java并发之AQS详解(待更)

一、为什么要用AQS同步框架&#xff1f; 开发者如果不了解JMM和多线程编程&#xff0c;就会写出很多线程不安全的程序&#xff0c;即使是经验丰富的程序员&#xff0c;并发编程也难免会出错。 而对于java程序员来说&#xff0c;并发编程就变得容易得多了&#xff0c;因为并发编…

《YOLOv7高阶自研》专栏介绍 CSDN独家改进创新实战 专栏目录

YOLOv7高阶自研专栏介绍: http://t.csdnimg.cn/tYI0c ✨✨✨前沿最新计算机顶会复现 🚀🚀🚀YOLOv7自研创新结合,轻松搞定科研 🍉🍉🍉持续更新中,定期更新不同数据集涨点情况 目录 全网首发&独家改进

C++DAY44

#include <iostream>using namespace std;class Animal//封装 动物 基类 { private:string name; public:Animal() {}Animal(string n):name(n){}virtual void perform() //虚函数{cout << "欢迎来到动物园" << endl;} };class Lion:public Animal…

LeetCode 1517. 查找拥有有效邮箱的用户

题目链接&#xff1a;1517. 查找拥有有效邮箱的用户 题目描述 表: Users Column NameTypeuser_idintnamevarcharmailvarchar user_id 是该表的主键&#xff08;具有唯一值的列&#xff09;。 该表包含了网站已注册用户的信息。有一些电子邮件是无效的。 编写一个解决方案&am…

LabVIEW将视觉生成器AI用作OPC服务器

LabVIEW将视觉生成器AI用作OPC服务器 介绍如何将视觉生成器AI配置为OPC服务器&#xff0c;并使用共享变量共享视觉生成器AI生成的结果。OPC是一系列标准规范&#xff0c;定义了来自不同制造商的控制设备之间的实时数据通信。OPC数据访问通信是基于客户端服务器的通信。 共享系…

适合自学的网络安全基础技能“蓝宝书”:《CTF那些事儿》

CTF比赛是快速提升网络安全实战技能的重要途径&#xff0c;已成为各个行业选拔网络安全人才的通用方法。但是&#xff0c;本书作者在从事CTF培训的过程中&#xff0c;发现存在几个突出的问题&#xff1a; 1&#xff09;线下CTF比赛培训中存在严重的 “最后一公里”问题 &#…

nodejs+vue+elementui养老院老年人服务系统er809

“养老智慧服务平台”是运用nodejs语言和vue框架&#xff0c;以MySQL数据库为基础而发出来的。为保证我国经济的持续性发展&#xff0c;必须要让互联网信息时代在我国日益壮大&#xff0c;蓬勃发展。伴随着信息社会的飞速发展&#xff0c;养老智慧服务平台所面临的问题也一个接…

Text-to-SQL小白入门(八)RLAIF论文:AI代替人类反馈的强化学习

学习RLAIF论文前&#xff0c;可以先学习一下基于人类反馈的强化学习RLHF&#xff0c;相关的微调方法&#xff08;比如强化学习系列RLHF、RRHF、RLTF、RRTF&#xff09;的论文、数据集、代码等汇总都可以参考GitHub项目&#xff1a;GitHub - eosphoros-ai/Awesome-Text2SQL: Cur…

【PX4】解决Resource not found: px4问题【踩坑实录】

【PX4】解决Resource not found: px4问题【踩坑实录】 文章目录 【PX4】解决Resource not found: px4问题【踩坑实录】1. 问题描述2. 错误排查 1. 问题描述 笔者在配置好px4的所有环境后&#xff0c;使用自己写的launch文件时&#xff0c;出现了报错 sjhsjhR9000X:~$ roslaunc…

【面试算法——动态规划 21】正则表达式匹配(hard) 交错字符串

10. 正则表达式匹配 链接: 10. 正则表达式匹配 给你一个字符串 s 和一个字符规律 p&#xff0c;请你来实现一个支持 ‘.’ 和 ‘*’ 的正则表达式匹配。 ‘.’ 匹配任意单个字符 ‘*’ 匹配零个或多个前面的那一个元素 所谓匹配&#xff0c;是要涵盖 整个 字符串 s的&#xf…

2023.10.10 关于 线程安全 问题

目录 线程安全问题实例一 引发线程安全的原因 抢占式执行 多线程修改同一变量 操作的原子性 指令重排序 内存可见性问题 线程安全问题实例二 如何解决上述线程安全问题 volatile 关键字 Java 内存模型 JMM&#xff08;Java Memory Model&#xff09; 线程安全问题实…

解决echarts配置滚动(dataZoom)后导出图片数据不全问题

先展现一个echarts&#xff0c;并配置dataZoom&#xff0c;每页最多10条数据&#xff0c;超出滚动 <div class"echartsBox" id"echartsBox"></div>onMounted(() > {nextTick(() > {var chartDom document.getElementById(echartsBox);…

前端URL拼接路径参数

前端URL拼接路径参数 一、应用场景二、具体实现1.字符串拼接2.URL对象实现 四、完整代码 一、应用场景 我们有时候会遇到浏览器URL拼接参数的场景&#xff0c;例如页面跳转时&#xff0c;带上一个特定的标识&#xff1a;https://www.baidu.com?fromcsdn 二、具体实现 1.字符…

微软发布2023年10月补丁,修复了103个缺陷,包括2个活跃的漏洞利用

导语 最近&#xff0c;微软发布了2023年10月的补丁更新&#xff0c;共修复了103个缺陷。这些补丁包括两个正在被黑客利用的漏洞。让我们来看看这些补丁的具体内容和影响。 修复103个缺陷 微软此次的补丁更新共修复了103个缺陷&#xff0c;其中13个被评为严重&#xff0c;90个被…

gradle对应jdk版本

官网地址-兼容性矩阵&#xff1a;Compatibility Matrix Gradle运行在所有主要的操作系统上。它需要Java开发工具包&#xff08;JDK&#xff09;版本8或更高版本才能运行。有关详细信息&#xff0c;您可以查看兼容性矩阵。

DailyPractice.2023.10.12

文章目录 1.[1. 两数之和]2.[49. 字母异位词分组]3.[128. 最长连续序列]4.[283. 移动零]5.[11. 盛最多水的容器]6.[15. 三数之和]7.[3. 无重复字符的最长子串]8.[206. 反转链表]9.[141. 环形链表]10.[160. 相交链表] 1.[1. 两数之和] 1. 两数之和 class Solution { public:ve…

单目标优化算法:火鹰优化算法(Fire Hawk Optimizer,FHO)求解23个函数--提供MATLAB代码

一、火鹰优化算法FHO 火鹰优化算法&#xff08;Fire Hawk Optimizer&#xff0c;FHO&#xff09;由Mahdi Azizi等人于2022年提出&#xff0c;该算法性能高效&#xff0c;思路新颖。 单目标优化&#xff1a;火鹰优化算法&#xff08;Fire Hawk Optimizer&#xff0c;FHO&#…

使用Tortoisegit界面拉起master主分支以副分支以及命令行操作

文章目录 1、Gui操作界面2、命令行操作 1、Gui操作界面 "小乌龟"通常指的是Git的图形用户界面&#xff08;GUI&#xff09;工具&#xff0c;其中比较常见的是TortoiseGit。下面是使用TortoiseGit来拉取&#xff08;checkout&#xff09;一个Git分支的步骤&#xff1a…

数字时代的自我呈现:探索个人形象打造的创新工具——FaceChain深度学习模型工具

数字时代的自我呈现&#xff1a;探索个人形象打造的创新工具——FaceChain深度学习模型工具 1.介绍 FaceChain是一个可以用来打造个人数字形象的深度学习模型工具。用户仅需要提供最低一张照片即可获得独属于自己的个人形象数字替身。FaceChain支持在gradio的界面中使用模型训…

机器学习(22)---信息熵、纯度、条件熵、信息增益

文章目录 1、信息熵2、信息增益3、例题分析 1、信息熵 1. 信息熵(information entropy)是度量样本集合纯度最常用的一种指标。信息的混乱程度越大&#xff0c;不确定性越大&#xff0c;信息熵越大&#xff1b;对于纯度&#xff0c;就是信息熵越大&#xff0c;纯度越低。 2. 纯度…