网络爬虫——urllib(2)

这篇具有很好参考价值的文章主要介绍了网络爬虫——urllib(2)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言🍭

 ❤️❤️❤️网络爬虫专栏更新中,各位大佬觉得写得不错,支持一下,感谢了!❤️❤️❤️

Python网络爬虫_热爱编程的林兮的博客-CSDN博客

 前篇讲解了urllib的基本使用、一个类型六个方法与下载相关内容,这篇继续讲解urlib的其他使用方法。

4、请求对象订制🍉

在将这个之前我们先来看看这个:

网络爬虫——urllib(2),Python网络爬虫,爬虫,python

在上篇中我们去获取百度首页的源码是http 开头的,但是在最新的百度首页我们可以看到是https开头

网络爬虫——urllib(2),Python网络爬虫,爬虫,python这个时候我们再去进行获取源码试试:

import urllib.request

url="https://www.baidu.com/"
response = urllib.request.urlopen(url)

content = response.read().decode("utf-8")

print(content)

代码运行:

网络爬虫——urllib(2),Python网络爬虫,爬虫,python

就会发现不一样,哎,为什么获取的是这个呢? 这是因为你给数据不完整,这是我们现在遇到的第一个反爬,这个时候需要先介绍一下User Agent

UA介绍:User Agent中文名为用户代理,简称 UA,它是一个特殊字符串头,使得服务器能够识别客户使用的操作系统 及版本、CPU 类型、浏览器及版本。浏览器内核、浏览器渲染引擎、浏览器语言、浏览器插件等

 UA大全:

网络爬虫——urllib(2),Python网络爬虫,爬虫,python

User Agent其实无处不在:

网络爬虫——urllib(2),Python网络爬虫,爬虫,python

 我们可以看到这个里面包含了很多信息,比如Windows版本、浏览器版本等等的信息。

User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36 Edg/117.0.2045.36

我们可以看到这是一个字典类型的数据,所以我们先要把它放在有一个字典里才能去使用,

headers={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36 Edg/117.0.2045.36"}

然后我们添加上headers,运行代码 

import urllib.request

url="https://www.baidu.com/"
headers={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36 Edg/117.0.2045.36"}

response = urllib.request.urlopen(url,headers)

content = response.read().decode("utf-8")
print(content)

发现还是不可以,报错了。然后我们去点击urlopen,查看源码

网络爬虫——urllib(2),Python网络爬虫,爬虫,python

我们看上面源码, 它说可以放一个Sring字符串或者Request对象,这时候就需要请求对象的定制,回归了主题。

那我们就把它封装成一个request对象,然后运行代码

import urllib.request

url="https://www.baidu.com/"
headers={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36 Edg/117.0.2045.36"}

# 因为urlopen万法中不能存储字典 所以headers不能传递进去
# 请求对象的定制
request = urllib.request.Request(url,headers)

response = urllib.request.urlopen(request)

content = response.read().decode("utf-8")
print(content)

发现还是报错了:

网络爬虫——urllib(2),Python网络爬虫,爬虫,python

这是为什么呢?我们打开Request源码:

网络爬虫——urllib(2),Python网络爬虫,爬虫,python

我们可以发现request中的变量是有顺序的,按照顺序我们才可以直接传值(直接写url和headers),所以我们需要进行关键字传参:

import urllib.request

url="https://www.baidu.com/"
headers={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36 Edg/117.0.2045.36"}

# 因为urlopen万法中不能存储字典 所以headers不能传递进去
# 请求对象的定制
request = urllib.request.Request(url=url,headers=headers)

response = urllib.request.urlopen(request)

content = response.read().decode("utf-8")
print(content)

运行代码我们就成功爬取出来了: 

网络爬虫——urllib(2),Python网络爬虫,爬虫,python

这是我们遇到的第一个反爬。 

url的组成🍓

以这个url为例: https://www.baidu.com/s?wd=周杰伦

协议 主机 端口号 路径 参数 锚点
http或https www.baidu.com http 80/https 443 s wd=周杰伦

编码的由来🍓

'''编码集的演变‐‐‐

由于计算机是美国人发明的,因此,最早只有127个字符被编码到计算机里,也就是大小写英文字母、数字和一些符号, 这个编码表被称为ASCII编码,比如大写字母A的编码是65,小写字母z的编码是122。 但是要处理中文显然一个字节是不够的,至少需要两个字节,而且还不能和ASCII编码冲突, 所以,中国制定了GB2312编码,用来把中文编进去。 你可以想得到的是,全世界有上百种语言,日本把日文编到Shift_JIS里,韩国把韩文编到Euc‐kr里, 各国有各国的标准,就会不可避免地出现冲突,结果就是,在多语言混合的文本中,显示出来会有乱码。 因此,Unicode应运而生。Unicode把所有语言都统一到一套编码里,这样就不会再有乱码问题了。 Unicode标准也在不断发展,但最常用的是用两个字节表示一个字符(如果要用到非常偏僻的字符,就需要4个字节)。 现代操作系统和大多数编程语言都直接支持Unicode。'''

编解码🍭

5、get请求的quote方法(字符串->Unicode编码)🍉

网络爬虫——urllib(2),Python网络爬虫,爬虫,python

 我们可以看到上面的url为

https://www.baidu.com/s?wd=周杰伦

但是我们复制下来就会变成Unicode编码:

https://www.baidu.com/s?wd=%E5%91%A8%E6%9D%B0%E4%BC%A6

但是如果是其他汉字情况下,我们不可以一直通过去查询将汉字转换成Unicode编码,所以我们需要学会借助quote方法将中文字符变成对应的Unicode编码

name = urllib.parse.quote('周杰伦')
print(name)

运行结果:

%E5%91%A8%E6%9D%B0%E4%BC%A6

然后爬取运行这个页面源码: 

import urllib.request

url = "https://www.baidu.com/?wd="
headers={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36 Edg/117.0.2045.41"}

# 因为urlopen万法中不能存储字典 所以headers不能传递进去
# 请求对象的定制
name = urllib.parse.quote('周杰伦')
# print(name)

url = url + name

request = urllib.request.Request(url=url,headers=headers)

response = urllib.request.urlopen(request)

content = response.read().decode("utf-8")
print(content)

运行结果: 

网络爬虫——urllib(2),Python网络爬虫,爬虫,python

6、get请求urlencode方法(多个字符串->Unicode编码)🍉

https://www.baidu.com/s?wd=周杰伦&sex=男

前面情况是当只需要转换少量字符串时 使用quote方法,当url中有很多字符串时,我们也是一个一个去转换然后进行拼接吗?

那这样效率就太慢了。

这时候我们就应该使用urlencode方法,下面我来演示一下如何使用:

import urllib.parse

# 要求参数必须以字典形式存在
data = {
    'wd': '周杰伦',
    'sex': '男'
}
a = urllib.parse.urlencode(data)
print(a)

运行代码:

wd=%E5%91%A8%E6%9D%B0%E4%BC%A6&sex=%E7%94%B7

我们可以发现它自动转换并拼接起来了,这就很方便了,所以当有多个字符串(参数)时使用urlencode方法将其直接转换。

那我们来进行一个简单的爬取:

import urllib.request
import urllib.parse

url = 'https://www.baidu.com/?'
data = {
    'wd': '周杰伦',
    'sex': '男'
}
data = urllib.parse.urlencode(data)

# 请求资源路径
url = url + data

headers = {
    "User-Agent":
        "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36 Edg/117.0.2045.43"

}

# 请求对象的定制
request = urllib.request.Request(url=url, headers=headers)

# 模拟浏览器向服务器发送请求
response = urllib.request.urlopen(request)

# 获取网页源码的数据
content = response.read().decode("utf-8")

# 打印数据
print(content)

运行结果: 

网络爬虫——urllib(2),Python网络爬虫,爬虫,python

 7、post请求方式🍉

打开谷歌浏览器,使用英文输入:spider

打开下面对应页面,找到正确的接口:

网络爬虫——urllib(2),Python网络爬虫,爬虫,python

 kw对应的就是你百度翻译所输入的:

网络爬虫——urllib(2),Python网络爬虫,爬虫,python

 点开预览,查看完整数据:

网络爬虫——urllib(2),Python网络爬虫,爬虫,python 那开始进行爬取

import urllib.request
import urllib.parse
url = 'https://fanyi.baidu.com/sug'
headers = {
    "User-Agent":
        "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36 Edg/117.0.2045.43"

}

# keyword = input('请输入您要查询的单词')
data = {
'kw':'spider'
}
# post请求的参数 必须要进行编码
data = urllib.parse.urlencode(data).encode('utf‐8')

# post的请求的参数 是不会拼接在ur1的后面的而是需要放在请求对象定制的参数中
# post请求的参数必须要进行编码
request = urllib.request.Request(url=url,headers=headers,data=data)

# 模拟浏览器向服务器发送请求
response = urllib.request.urlopen(request)

# 获取响应的数据
print(response.read().decode('utf‐8'))

 我们运行发现有数据显示,但是有Unicode编码乱码问题

网络爬虫——urllib(2),Python网络爬虫,爬虫,python

 发现这是一个json数据,所以我们应该 将其转换成json对象然后输出

import urllib.request
import urllib.parse

url = 'https://fanyi.baidu.com/sug'
headers = {
    "User-Agent":
        "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36 Edg/117.0.2045.43"

}

# keyword = input('请输入您要查询的单词')
data = {
    'kw': 'spider'
}
# post请求的参数 必须要进行编码
data = urllib.parse.urlencode(data).encode('utf‐8')

# post的请求的参数 是不会拼接在ur1的后面的而是需要放在请求对象定制的参数中
# post请求的参数必须要进行编码
request = urllib.request.Request(url=url, headers=headers, data=data)

# 模拟浏览器向服务器发送请求
response = urllib.request.urlopen(request)

# 获取响应的数据
content = response.read().decode('utf‐8')
print(content)

# 查看数据类型 字符串类型
print(type(content))

# 字符串-> json对象
import json

obj = json.loads(content)
print(obj)

运行结果: 

{"errno":0,"data":[{"k":"spider","v":"n. \u8718\u86db; \u661f\u5f62\u8f6e\uff0c\u5341\u5b57\u53c9; \u5e26\u67c4\u4e09\u811a\u5e73\u5e95\u9505; \u4e09\u811a\u67b6"},{"k":"Spider","v":"[\u7535\u5f71]\u8718\u86db"},{"k":"SPIDER","v":"abbr. SEMATECH process induced damage effect revea"},{"k":"spiders","v":"n. \u8718\u86db( spider\u7684\u540d\u8bcd\u590d\u6570 )"},{"k":"spidery","v":"adj. \u50cf\u8718\u86db\u817f\u4e00\u822c\u7ec6\u957f\u7684; \u8c61\u8718\u86db\u7f51\u7684\uff0c\u5341\u5206\u7cbe\u81f4\u7684"}],"logid":1250011545}
<class 'str'>
{'errno': 0, 'data': [{'k': 'spider', 'v': 'n. 蜘蛛; 星形轮,十字叉; 带柄三脚平底锅; 三脚架'}, {'k': 'Spider', 'v': '[电影]蜘蛛'}, {'k': 'SPIDER', 'v': 'abbr. SEMATECH process induced damage effect revea'}, {'k': 'spiders', 'v': 'n. 蜘蛛( spider的名词复数 )'}, {'k': 'spidery', 'v': 'adj. 像蜘蛛腿一般细长的; 象蜘蛛网的,十分精致的'}], 'logid': 1250011545}

总结:post和get区别?🍉

  1. get请求方式的参数必须编码,参数是拼接到url后面,编码之后不需要调用encode方法
  2. post请求方式的参数必须编码,参数是放在请求对象定制的方法中,编码之后需要调用encode方法

网络爬虫——urllib(2),Python网络爬虫,爬虫,python文章来源地址https://www.toymoban.com/news/detail-713271.html

到了这里,关于网络爬虫——urllib(2)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python 爬虫之 urllib 包基本使用

    urllib 是一个 python 内置包,不需要额外安装即可使用,包里面包含了以下几个用来处理 url 的模块: urllib.request,用来打开和读取 url,意思就是可以用它来模拟发送请求,就像在浏览器里输入网址然后敲击回车一样,获取网页响应内容。 urllib.error,用来处理 urllib.request 引起

    2024年02月09日
    浏览(58)
  • Python爬虫库之urllib使用详解

      一、Python urllib库 Python urllib 库用于操作网页 URL,并对网页的内容进行抓取处理。 Python3 的 urllib。 urllib 包 包含以下几个模块: urllib.request - 打开和读取 URL。 urllib.error - 包含 urllib.request 抛出的异常。 urllib.parse - 解析 URL。 urllib.robotparser - 解析 robots.txt 文件。 二、urllib.r

    2024年02月11日
    浏览(47)
  • Python爬虫基础(一):urllib库的使用详解

    Python爬虫基础(一):urllib库的使用详解 Python爬虫基础(二):使用xpath与jsonpath解析爬取的数据 Python爬虫基础(三):使用Selenium动态加载网页 Python爬虫基础(四):使用更方便的requests库 Python爬虫基础(五):使用scrapy框架 urllib是一个python自带的库,不需要手动安装。

    2024年02月08日
    浏览(54)
  • Python爬虫技术系列-01请求响应获取-urllib库

    参考连接: https://zhuanlan.zhihu.com/p/412408291 1.1.1 urllib简介 Urllib是python内置的一个http请求库,不需要额外的安装。只需要关注请求的链接,参数,提供了强大的解析功能 Urllib库有四个模块:request,error, parse, robotparser request:发起请求(重要) error:处理错误 parse:解析RUL或

    2024年02月07日
    浏览(48)
  • python爬虫-------urllib代理和代理池(第十七天)

    🎈🎈作者主页: 喔的嘛呀🎈🎈 🎈🎈所属专栏:python爬虫学习🎈🎈 ✨✨谢谢大家捧场,祝屏幕前的小伙伴们每天都有好运相伴左右,一定要天天开心哦!✨✨  嗨嗨嗨,兄弟姐妹们。我是喔的嘛呀。今天的学习内容是:爬虫 urllib代理和代理池 目录 一、爬虫 urllib——代理

    2024年04月14日
    浏览(43)
  • Python爬虫 从小白到高手 各种最新案例! Urllib Xpath

    1.什么是互联网爬虫? 如果我们把互联网比作一张大的蜘蛛网,那一台计算机上的数据便是蜘蛛网上的一个猎物,而爬虫程序就是一只小蜘蛛,沿着蜘蛛网抓取自己想要的数据 解释1:通过一个程序,根据Url(淘宝)进行爬取网页,获取有用信息 解释2:使用程序模拟浏览器,去

    2024年02月10日
    浏览(47)
  • 【Python爬虫开发实战①】使用urllib以及XPath爬取可爱小猫图片

    个人主页 :为梦而生~ 关注我一起学习吧! 专栏 :python网络爬虫从基础到实战 欢迎订阅!后面的内容会越来越有意思~ 往期推荐 : 【Python爬虫开发基础⑦】urllib库的基本使用 【Python爬虫开发基础⑧】XPath库及其基本用法 我们在之前已经有8篇文章讲述基础知识了,下面我们

    2024年02月11日
    浏览(74)
  • Python爬虫 —— urllib库的使用(get/post请求+模拟超时/浏览器)

    爬虫简介 :网络爬虫就是按照一定规则,自动抓取互联网信息的程序或脚本,由于互联网数据的多样性和资源的有限性,根据用户需求定向抓取相关网页并分析就是爬虫要做的工作 为什么我们把它称为爬虫(Spider)嘞?互联网就像是一张大网,而每一个网页就是这张大网上

    2023年04月13日
    浏览(45)
  • 【Python爬虫开发实战②】使用urllib以及jsonpath爬取即将上映电影信息

    🚀 个人主页 :为梦而生~ 关注我一起学习吧! 💡 专栏 :python网络爬虫从基础到实战 欢迎订阅!后面的内容会越来越有意思~ 💡 往期推荐 : ⭐️首先,我们前面讲了多篇基础内容: 【Python爬虫开发基础④】爬虫原理 【Python爬虫开发基础⑤】HTML概述与基本标签详解 【P

    2024年02月12日
    浏览(48)
  • Python爬虫教程:使用requests、wget和urllib3下载图片和PDF文件

    本文介绍了如何使用Python中的requests、wget和urllib3库下载图片和PDF文件,通过示例代码演示了如何通过Selenium定位文件地址后,使用这三种方法进行文件下载操作。

    2024年02月09日
    浏览(73)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包