Python自带爬虫库urllib

news2024/11/20 2:35:47

一、什么是urllib

    它是一个http请求的Python自带的标准库,无需安装,直接可以用。并且提供了如下功能:网页请求、响应获取、代理和cookie设置、异常处理、URL解析,可以说是一个比较强大的模块。

二、urllib模块

可分为以下模块:

urllib.request        请求模块urllib.error          异常处理模块urllib.parse          解析模块urllib.robotparser    解析模块

那么,我们先从第一个模块开始说起吧,首先说一下它的大致用法:

urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None) #里面有很多方法,类似与requests模块中的renquest方法

request里包含了很多方法,如果我们要发送一个请求并读取请求内容,最简单的方法就是:

请求格式:

urllib.request.urlopen(url,data,timeout)

url :请求地址

data:请求数据

timeout:请求超时时间

图片

    这里采用的是get请求,如果想要进行post请求,只需给data方法传参数即可,这里有个问题需要,因为传递参数必须是字节,所以得先编码成bytes才能读取。

图片

也可以这样写:

图片

    通过解析模块先将它解析为byte格式然后读取,同样行之有效,这样就完成了一次post请求。

    通过上面例子我们找到了request模块的使用方法,我们使用response.read()获取的是响应体的内容,我们还可以通过response.status、response.getheaders().response.getheader("server"),获取状态码以及头部信息,如果我们要给请求的网址添加头部信息的话了,就要使用urllib.request.Request方法了。

它的用法为:

urllib.request.Request(url,data,headers,timeout,method)

url:请求地址

data:请求数据

headers:请求头

timeout:请求超时时间

method:请求方法,如get post

大致了解下我们可以先来访问下起点网:

from urllib import request, parse
url = 'https://book.qidian.com/info/1014243481#Catalog'headers = {    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36',    'Host': 'book.qidian.com'}data = {    'hw': 'hw'}data = bytes(parse.urlencode(data), encoding='utf8')req = request.Request(url=url, data=data,timeout=2,headers=headers, method='POST')response = request.urlopen(req)print(response.read().decode('utf-8'))

可以看出这是个post请求,因为method设置为post,data传了参数。

这里补充说明下有个urlencode方法,它的作用是将字典转换为url,例子如下:

from urllib.parse import urlencode
data = {    "name":"hw",    "age":25,}url = "https://www.baidu.com?"
page_url = url+urlencode(data)print(page_url)

添加请求头其实还有一种方法,请看:

from urllib import request, parseurl = 'https://book.qidian.com/info/1014243481#Catalog'data = {    'hw': 'hw'}data = bytes(parse.urlencode(data), encoding='utf8')req = request.Request(url=url, data=data,method='POST')req.add_header('User-Agent','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrom/78.0.3904.108 Safari/537.36') #添加请求头response = request.urlopen(req)print(response.read().decode('utf-8'))

    这种添加方式有个好处是自己可以定义一个请求头字典,然后循环进行添加,伪造多个浏览器头。

urllib.request 还可以设置代理,用法如下,

urllib.request.ProxyHandler({'http':'http://fsdfffs.com','https':'https://fsdfwe.com'})

这样就可以避免同一个IP访问网站多次被封的尴尬局面了。

import urllib.request
proxy_handler = urllib.request.ProxyHandler({    'http': 'http://127.0.0.1:8000',    'https': 'https://127.0.0.1:8000'})opener = urllib.request.build_opener(proxy_handler) #构建代理池response = opener.open('https://book.qidian.com/info/1014243481#Catalog') #代理访问网站print(response.read())

图片

可以看出,由于本人使用无用的IP导致链接错误,所以此时应该处理异常。

图片

换了种处理异常的方式,不过总的来说还是比较全面的。异常模块中有两个异常错误:

URLError,HTTPError,其中HTTPError是URLError的子类,URLError 里只有一个属性:reason,即抓异常的时候只能打印错误信息,类似上面的例子。

HTTPError 里有三个属性:code,reason,headers,即抓异常的时候可以获得code,reson,headers三个信息,

import socketimport urllib.requestimport urllib.erroraa=''try:    response = urllib.request.urlopen('https://book.qidian.com/info/1014243481#Catalog', timeout=0.1)    aa=response.read().decode('utf8')except urllib.error.URLError as e:    print(e.reason)    if isinstance(e.reason,socket.timeout):        print("time out")except urllib.error.HTTPError as e:print(e.reason,e.code)finally:    print(aa)

除此之外,它还可以处理cookie数据,不过要借助另一个模块 http。

import http.cookiejar, urllib.requestcookie = http.cookiejar.CookieJar() #创建cookiejar对象handler = urllib.request.HTTPCookieProcessor(cookie) 建立cookie请求opener = urllib.request.build_opener(handler) #构建请求response = opener.open('https://www.baidu.com') #发送请求for item in cookie:    print(item.name+"="+item.value)  #打印cookie信息

同时cookie可以写入到文件中保存,有两种方式http.cookiejar.MozillaCookieJar和http.cookiejar.LWPCookieJar(),想用哪种自己决定。

http.cookiejar.MozillaCookieJar()方式

import http.cookiejar, urllib.requestfilename = "cookie.txt"cookie = http.cookiejar.MozillaCookieJar(file_name)handler = urllib.request.HTTPCookieProcessor(cookie)opener = urllib.request.build_opener(handler)response = opener.open('https://www.baidu.com')cookie.save(ignore_discard=True, ignore_expires=True)#保存信息

http.cookiejar.LWPCookieJar()方式

import http.cookiejar, urllib.requestfilename = 'cookie.txt'cookie = http.cookiejar.LWPCookieJar(file_name)handler = urllib.request.HTTPCookieProcessor(cookie)opener = urllib.request.build_opener(handler)response = opener.open('https://www.baidu.com')cookie.save(ignore_discard=True, ignore_expires=True)

如果想要通过获取文件中的cookie获取的话可以通过load方式,它也有两种方式,http.cookiejar.MozillaCookieJar和http.cookiejar.LWPCookieJar(),想用哪种自己决定。

http.cookiejar.MozillaCookieJar()方式

import http.cookiejar, urllib.requestcookie = http.cookiejar.MozillaCookieJar()cookie.load('cookie.txt', ignore_discard=True, ignore_expires=True)handler = urllib.request.HTTPCookieProcessor(cookie)opener = urllib.request.build_opener(handler)response = opener.open('https://www.baidu.com')print(response.read().decode('utf-8'))

http.cookiejar.LWPCookieJar()方式

import http.cookiejar, urllib.requestcookie = http.cookiejar.LWPCookieJar()cookie.load('cookie.txt', ignore_discard=True, ignore_expires=True)handler = urllib.request.HTTPCookieProcessor(cookie)opener = urllib.request.build_opener(handler)response = opener.open('https://www.baidu.com')print(response.read().decode('utf-8'))

urllib parse模块

    它是负责解析页面内容,模块下有一个urlparse方法用于拆分解析内容,具体用法如下:

urllib.parse.urlparse(url,scheme)

URL:页面地址

scheme: 协议类型 ,比如 http  https

图片

    有拆分当然也会有拼接,我们可以看到上面返回的有六个值,所以我们在做拼接时一定要填写六个参数,否则它会报没有足够的值用来解包的错误。

urllib.parse.urlunpars(url,scheme)

图片

图片

类似的拼接方法其实还有,比如说urljoin,例子如下:

图片

    urllib.robotparser 它也是一个解析模块,从它的字面意思看,应该是一个机器人解析模块。

    而且它还与机器人协议有关联,它的存在就是为了解析每个网站中机器人协议,判断这个网站是否可以抓取。

    每个网站中都会有一个robots.txt文件,我们要做的就是先解析它,然后在对要下载的网页数据进行判断是否可以抓取。

图片

可以通过直接输入url的方式来判断:

from urllib import robotparserrb = robotparser.RobotFileParser('https://www.baidu.com/robots.txt')print(rb.read())url = 'https://www.baidu.com'user_agent = 'BadCrawler'aa=rb.can_fetch(user_agent, url) #确定指定的用户代理是否允许访问网页print(aa) #禁止使用的用户代理 falseuser_agent = 'Googlebot'bb=rb.can_fetch(user_agent, url) print(bb)#允许使用的用户代理  true

也可以通过间接设置url的方式来判断:

from urllib import robotparserrb = robotparser.RobotFileParser()rb.set_url('https://www.baidu.com/robots.txt')rb.read() #读取url = 'https://www.baidu.com'user_agent = 'BadCrawler'aa=rb.can_fetch(user_agent, url) #确定指定的用户代理是否允许访问网页print(aa) #禁止使用的用户代理 falseuser_agent = 'Googlebot'bb=rb.can_fetch(user_agent, url) print(bb)#允许使用的用户代理  trueprint(rb.mtime()) #返回抓取分析robots协议的时间rb.modified() #将当前时间设置为上次抓取和分析 robots.txt 的时间print(rb.mtime())# 返回 robots.txt 文件对请求速率限制的值print(rb.request_rate('Googlebot'))  print(rb.request_rate('MSNBot'))# 返回 robotx.txt 文件对抓取延迟限制的值print(rb.crawl_delay('Googlebot'))print(rb.crawl_delay('MSNBot'))

三、应用案例:爬取起点小说名

    老样子,按下键盘快捷键F12,进行网页分析,这次我们采用lxml,我们得知只需要将这个页面中的某一个部分的数据变动一下就可以抓取到所有数据。如图:

图片

    下次我们来讲lxml和xpath语法,以便于大家更好的爬取数据,urllib内容就这么多,并不复杂,requests更为简单易学。

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

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

相关文章

2024中青杯数学建模C题:“X 疾病”在人群中的传播代码论文思路分析

2024中青杯数学建模C题论文和代码已完成,代码为C题全部问题的代码,论文包括摘要、问题重述、问题分析、模型假设、符号说明、模型的建立和求解(问题1模型的建立和求解、问题2模型的建立和求解、问题3模型的建立和求解)、模型的评价…

Docker Compose使用

Docker-Compose是什么 docker建议我们每一个容器中只运行一个服务,因为doker容器本身占用资源极少,所以最好是将每个服务单独分割开来,但是这样我们又面临了一个问题: 如果我需要同时部署好多个服务,难道要每个服务单独写Docker…

如何彻底搞懂迭代器(Iterator)设计模式?

说起迭代器(Iterator),相信你并不会陌生,因为我们几乎每天都在使用JDK中自带的各种迭代器。那么,这些迭代器是如何构建出来的呢?就需要用到了今天内容要介绍的迭代器设计模式。在日常开发过程中&#xff0c…

刷题之将有序数组转换成二叉搜索树(leetcode)

将有序数组转换成二叉搜索树 正常递归,中序遍历 递归经常会把自己绕晕,还是得画图分析 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(null…

【LeetCode 随笔】面试经典 150 题【中等+困难】持续更新中。。。

文章目录 380.【中等】O(1) 时间插入、删除和获取随机元素238.【中等】除自身以外数组的乘积134.【中等】 加油站135.【困难】分发糖果42.【困难】接雨水 🌈你好呀!我是 山顶风景独好 💝欢迎来到我的博客,很高兴能够在这里和您见面…

【Docker实操】启动redis服务

一、步骤 1、获取redis镜像 执行获取redis镜像命令&#xff1a;docker pull redis。打印镜像清单&#xff0c;可以看到新拉到的redis镜像。 2、创建redis.conf配置文件 linux主机 mkdir -p /root/www/redis/conf touch /root/www/redis/conf/redis.conf cat << EOF &…

vue中数据已经改变了,但是table里面内容没更新渲染!

解决方案&#xff1a; 给table或者el-table标签上添加一个动态key值&#xff0c;只要数据发生改变&#xff0c;key值变动一下即可 标签上&#xff1a; :key“timeStamp” 初始data&#xff1a;timeStamp:0, 更新数据&#xff1a;this.timeStamp 这样每次更新数据&#xff…

网络的基础理解

文章目录 网络的基础认识 网络协议协议分层OSI七层模型TCP/IP 五层/四层 模型 网络的基础认识 先来看下面几个问题 什么是网络&#xff1f; 网络就是有许多台设备包括计算机单不仅限于计算机&#xff0c;这些设备通过相互通信所组成起来系统&#xff0c;我们称之为网络所以如…

通过 Spring 操作 Redis

要想通过 Java 操作 redis&#xff0c;首先要连接上 redis 服务器&#xff0c;推荐看通过 Java 操作 redis -- 连接 redis 创建项⽬ 勾选 NoSQL 中的 Spring Data Redis 当然, 把 Web 中的 Spring Web 也勾选⼀下.⽅便写接进⾏后续测试. 配置 redis 服务地址 在 application.…

CF451E: Devu and Flowers(容斥原理 + 考虑反面 + golang组合模版)

题目截图 题目翻译 题目分析 正难则反&#xff0c;考虑所有不符合的例子 由于n很小&#xff0c;所以可以状态压缩二进制遍历完全部不符合例子的组合 对于不符合的例子&#xff0c;假设其中第i个不符合&#xff0c;那么就消耗掉fi 1个球 以此类推&#xff0c;减剩下s2个球 这时…

盘点28个免费域名申请大全

盘点28个免费域名申请大全 免费域名推荐学习使用&#xff0c;免费就意味着没任何保障。 名称稳定时间支持解析模式后缀格式说明地址EU.org28 年NS.eu.org/. 国家简写.eu.org需要审核&#xff0c;稳定性高&#xff0c;限制少&#xff0c;国内访问有问题&#xff0c;可 CFeu.orgp…

关于「公 告」根据中华人民共和国法律,Bing 在中国内地暂停 “搜索自动建议” 功能 30 天

当我看见我们大家都这样我可放心了&#xff0c;我打开电脑搜索图片就发生了。 当我看见我们大家都这样我可放心了&#xff0c;坐等攻城狮修复。

前端vue用el-table如何实现表头内容过长换行处理,实现换行效果

前端vue用el-table如何实现表头内容过长换行处理&#xff0c;实现换行效果 这是效果图 有两种方法&#xff0c;一种简易版本&#xff0c;一种万能方法,都是el-table&#xff0c;先看文档 表头标题是可以自定义的 方法一 label的解释写在代码里面了&#xff0c;这里会自动形成换…

六零导航页 file.php 任意文件上传漏洞复现(CVE-2024-34982)

0x01 产品简介 LyLme Spage(六零导航页)是中国六零(LyLme)开源的一个导航页面。致力于简洁高效无广告的上网导航和搜索入口,支持后台添加链接、自定义搜索引擎,沉淀最具价值链接,全站无商业推广,简约而不简单。 0x02 漏洞概述 六零导航页 file.php接口处任意文件上传…

中银基金软件开发工程师春招群面记录

本文介绍2024届春招中&#xff0c;中国银行下属中银基金管理有限公司的软件开发工程师岗位1场面试的基本情况、提问问题等。 2024年04月投递了中国银行的共计4个部门或单位&#xff0c;包括中银基金管理有限公司的软件开发工程师岗位&#xff0c;暂时不清楚所在部门。目前完成了…

AWS安全性身份和合规性之Artifact

AWS Artifact是对您很重要的与合规性相关的信息的首选中央资源。AWS Artifact是一项服务&#xff0c;提供了一系列用于安全合规的文档、报告和资源&#xff0c;以帮助用户满足其合规性和监管要求。它允许按需访问来自AWS和在AWS Marketplace上销售产品的ISV的安全性和合规性报告…

I.MX6Ull交叉编译QT项目并用u盘拷贝到开发板下

1.安装交叉编译器 2.命令行交叉编译Qt项目 3.拷贝编译好的执行程序到开发板运行 下载到虚拟机 修改权限chom u x 名称 执行完后&#xff0c;变色 执行脚本文件&#xff0c;使能 source /opt/fsl-imx-x11/4.1.15-2.1.0/environment-setup-cortexa7hf-neon-poky-linux-gnueabi …

利用远控工具横向

一.横向移动介绍和方式 1.介绍 内网渗透的横向移动是指攻击者在成功进入内网后&#xff0c;通过利用内部系统的漏洞或者获取的合法访问权限&#xff0c;从一个受感染的系统向其他系统扩散或移动。这种横向移动的目的通常是为了获取更多的敏感信息、提升权限、扩大攻击面或者更…

将PCD点云投影到BEV平面得到图片

前言 点云数据作为一种丰富的三维空间信息表达方式&#xff0c;通常用于自动驾驶、机器人导航和三维建模等领域。然而&#xff0c;点云数据的直观性不如二维图像&#xff0c;这限制了它在一些需要快速视觉反馈的应用场景中的使用。本文将探讨如何将点云数据转换为二维图像&…

【传知代码】从零开始搭建图像去雾神经网络-论文复现

文章目录 概述原理介绍网络结构 核心逻辑迁移学习子网数据拟合子网 环境配置训练本次复现代码所用数据集测试本次复现代码所用的评价指标 结果展示在O-Haze数据集上的结果在I-Haze数据集上的结果 小结 本文涉及的源码可从从零开始搭建图像去雾神经网络该文章下方附件获取 本文复…