四、(2)获取数据(补充urllib)(爬虫及数据可视化)

四、(2)获取数据(补充urllib)(爬虫及数据可视化)

  • urllib
    • get请求
    • post请求
    • User-Agent
    • Response
    • 模拟真实信息
    • 在豆瓣spider中真实实现

urllib

此处的扩展,可以进行在主体的程序学习完成后,再回过头来学习,用于新的网站的爬取等分析

Python3中将urllib2中的功能整合到urllib中了,使用urllib就可以了
在这里插入图片描述

此处主要讲解urllib的扩展,可以增加创新性,也可跳过,不影响主代码的编写

get请求

#获取一个get请求
response = urllib.request.urlopen("http://www.baidu.com")  #打开网页并将网页的数据返回
#print(response)         #打印结果<http.client.HTTPResponse object at 0x0000013918EEF188>
#从打印的结果可以看出,返回来一个HTTPResponse的对象,此对象包含网页的所有信息,可以使用read读取出来
#print(response.read())
#对获取到的网页源码进行utf-8解码
print(response.read().decode('utf-8'))          #使用decode('utf-8')解析,防止中文乱码

结果如下,简写

<!DOCTYPE html><!--STATUS OK-->
<html><head><meta http-equiv="Content-Type" content="text/html;charset=utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"><meta content="always" name="referrer"><meta name="theme-color" content="#2932e1"><meta name="description" content="全球最大的中文搜索引擎、致力于让网民更便捷地获取信息,找到所求。百度超过千亿的中文网页数据库,可以瞬间找到相关的搜索结果。"><link rel="shortcut icon" href="/favicon.ico" type="image/x-icon" /><link rel="search" type="application/opensearchdescription+xml" href="/content-search.xml" title="百度搜索" /><link rel="icon" sizes="any" mask 
...........<script>if (navigator.userAgent.indexOf('Edge') > -1) {var body = document.querySelector('body');body.className += ' browser-edge';}
</script>
<textarea id="s_is_result_css" style="display:none;">

post请求

#获取一个post请求
#访问网址,可发送表单,可将用户名、密码加密
#post必须有服务器端的获取响应才行,又不想写一个服务器代码,使用网址httpbin.org可用来测试
#当向此网址发送请求时会响应,可进行测试自己的请求的响应

在这里插入图片描述
在这里插入图片描述

#获取一个post请求
#访问网址,可发送表单,可将用户名、密码加密
#post必须有服务器端的获取响应才行,又不想写一个服务器代码,使用网址httpbin.org可用来测试
#当向此网址发送请求时会响应,可进行测试自己的请求的响应
'''
response = urllib.request.urlopen("http://httpbin.org/post")    #此处默认进行post请求的
print(response)         #直接打印会报错,urllib.error.HTTPError: HTTP Error 405: METHOD NOT ALLOWED#是不能直接进行post访问的,需要对发送表单封装才能进行post访问
'''import urllib.request
import urllib.parse         #解析器,可以解析键值对,#bytes()  可以将里面数据转换成2进制的数据包
data = bytes(urllib.parse.urlencode({"hello":"world"}),encoding="utf-8")    #使用utf-8的方式将键值对解析,并封装成2进制数据
#data可以作为post传递的内容
response = urllib.request.urlopen("http://httpbin.org/post",data=data)
print(response.read().decode('utf-8'))

上方一段代码运行后

Response body
{"args": {}, "data": "", "files": {}, "form": {"hello": "world"}, "headers": {"Accept-Encoding": "identity", "Content-Length": "11", "Content-Type": "application/x-www-form-urlencoded", "Host": "httpbin.org", "User-Agent": "Python-urllib/3.7", "X-Amzn-Trace-Id": "Root=1-5fb778bb-56192ac74ae35b32718702aa"}, "json": null, "origin": "218.201.130.74", "url": "http://httpbin.org/post"
}

上方会将收到的表单放入form显示()
使用urlib模拟浏览器发送请求

若使用post方式访问是,必须按照post方式封装数据

#get请求无需传递data
response = urllib.request.urlopen("http://httpbin.org/get")
print(response.read().decode('utf-8'))

User-Agent

下方的User-Agent,直接告诉浏览器自己是爬虫,若对方有防御,只要有Python-urllib/3.7就无法爬取。

{"args": {}, "headers": {"Accept-Encoding": "identity", "Host": "httpbin.org", "User-Agent": "Python-urllib/3.7", "X-Amzn-Trace-Id": "Root=1-5fb77b02-41623d10507c765005fe7ed1"}, "origin": "218.201.130.74", "url": "http://httpbin.org/get"
}

在这里插入图片描述

Response

单段代码,可直接运行

import urllib.request#超时处理
#对于超时,需要有个计划性的准备
#不一定是0.01秒,正常3秒,5秒还没有响应就不用爬取了
try:response = urllib.request.urlopen("http://httpbin.org/get",timeout=0.01)        #此处若超时0.01就报错print(response.read().decode('utf-8'))
except urllib.error.URLError as e:                  #若有多个错误可以加入print("timeout!")#当返回状态码为418,则表明被发现是爬虫了
#平常经常使用请求看网页,看信息,此处可以简单解析
#response = urllib.request.urlopen("http://douban.com")
#print(response.status)                          #urllib.error.HTTPError: HTTP Error 418: 被发现是爬虫#response = urllib.request.urlopen("http://httpbin.org/get")
#print(response.status)                          #200  表示正常response = urllib.request.urlopen("http://www.baidu.com")
print(response.getheaders())                #拿到整个header信息
print(response.getheader("Server"))         #可以拿到里面的具体内容

打印结果

[('Bdpagetype', '1'), ('Bdqid', '0xab3ddba0000896e8'), ('Cache-Control', 'private'), ('Content-Type', 'text/html;charset=utf-8'), ('Date', 'Fri, 20 Nov 2020 08:41:34 GMT'), ('Expires', 'Fri, 20 Nov 2020 08:41:20 GMT'), ('P3p', 'CP=" OTI DSP COR IVA OUR IND COM "'), ('P3p', 'CP=" OTI DSP COR IVA OUR IND COM "'), ('Server', 'BWS/1.1'), ('Set-Cookie', 'BAIDUID=F9D3BADF25A1AA5CE17143909FE3D220:FG=1; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com'), ('Set-Cookie', 'BIDUPSID=F9D3BADF25A1AA5CE17143909FE3D220; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com'), ('Set-Cookie', 'PSTM=1605861694; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com'), ('Set-Cookie', 'BAIDUID=F9D3BADF25A1AA5C801B5470001E58EF:FG=1; max-age=31536000; expires=Sat, 20-Nov-21 08:41:34 GMT; domain=.baidu.com; path=/; version=1; comment=bd'), ('Set-Cookie', 'BDSVRTM=0; path=/'), ('Set-Cookie', 'BD_HOME=1; path=/'), ('Set-Cookie', 'H_PS_PSSID=1463_32855_33117_33058_31253_33099_33100_32962_26350_22158; path=/; domain=.baidu.com'), ('Traceid', '1605861694261455130612339260034306840296'), ('Vary', 'Accept-Encoding'), ('Vary', 'Accept-Encoding'), ('X-Ua-Compatible', 'IE=Edge,chrome=1'), ('Connection', 'close'), ('Transfer-Encoding', 'chunked')]
BWS/1.1

与下方的进行对比可得

在这里插入图片描述

Response引入的对象不仅仅将网页信息保存,还能获取请求中的头部信息状态码等。

#爬取爬虫时,需要将自己模拟为一个浏览器
url = "https://www.douban.com"
#需要将自己的请求对象再次封装一下
req = urllib.request.Request(url=url,data=data,headers=headers,method="POST")

在这里插入图片描述

主要的是user-agent这就是关键,要想完全模拟甚至可以将上面的所有内容args,data,headers等键值对中的全部封装

Headers中的内容怎么得到,在浏览器的检查中,有user-agent,将当前浏览器的复制下来
在这里插入图片描述

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

模拟真实信息

#爬取爬虫时,需要将自己模拟为一个浏览器
#url = "https://www.douban.com"
url = "http://httpbin.org/post"
#需要将自己的请求对象再次封装一下
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36"}
data = bytes(urllib.parse.urlencode({"name":"eric"}),encoding="utf-8")  #使用utf-8的方式将键值对解析,并封装成2进制数据
#data可以作为post传递的内容
req = urllib.request.Request(url=url,data=data,headers=headers,method="POST")       #构建的是请求对象
#需要发出请求
response = urllib.request.urlopen(req)
print(response.read().decode('utf-8'))
#下面是访问真实豆瓣的代码(可以模拟浏览器,欺骗豆瓣了)
#爬取爬虫时,需要将自己模拟为一个浏览器(爬取豆瓣的网页,一定要将浏览器的user-agent信息填写)
url = "https://www.douban.com"
#需要将自己的请求对象再次封装一下
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36"}
#data = bytes(urllib.parse.urlencode({"name":"eric"}),encoding="utf-8")  #使用utf-8的方式将键值对解析,并封装成2进制数据
#data可以作为post传递的内容
req = urllib.request.Request(url=url,headers=headers)       #构建的是请求对象
#需要发出请求
response = urllib.request.urlopen(req)
print(response.read().decode('utf-8'))

打印结果如下

<!DOCTYPE HTML>
<html lang="zh-cmn-Hans" class="ua-windows ua-webkit">
<head>
<meta charset="UTF-8">
<meta name="google-site-verification" content="ok0wCgT20tBBgo9_zat2iAcimtN4Ftf5ccsh092Xeyw" />
<meta name="description" content="提供图书、电影、音乐唱片的推荐、评论和价格比较,以及城市独特的文化生活。">
<meta name="keywords" content="豆瓣,小组,电影,同城,豆品,广播,登录豆瓣">
<meta property="qc:admins" content="2554215131764752166375" />
<meta property="wb:webmaster" content="375d4a17a4fa24c2" />
<meta name="mobile-agent" content="format=html5; url=https://m.douban.com">
<title>豆瓣</title>
<script>
。。。

在豆瓣spider中真实实现

在这里插入图片描述

https://movie.douban.com/top250?start=0

在这里插入图片描述

User-Agent: 
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36
#得到指定一个url的网页内容
def askURL(url):#head作用是为了让对方自己是浏览器,模拟浏览器头部信息,向豆瓣服务器发送消息#head信息一定不要写错,否则会返回否码为418,对方不认为我们是浏览器head = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36"}               #如果信息不多的话,可以使用键值对的方式,若很多的话可以使用列表的方式head=[]#用户代理。表示告诉豆瓣服务器。我们是什么类型的机器。浏览器(本质上是告诉浏览器。我们可以接收什么水平的文件内容)#发送消息使用下方方式request = urllib.request.Request(url=url, headers=head)  # 构建的是请求对象,使用Request()封装了请求对象,此对象包含url和head头部信息#可以携带头部信息访问url,try:response = urllib.request.urlopen(request)          #发送请求对象,返回一个response对象,此对象包含我们的网页信息html = response.read().decode("utf-8")              #将读取的html界面读取出来print(html)except urllib.error.URLError as e:                      #访问时可能会遇到404遇到一些浏览器内部错误,如500等if hasattr(e,"code"):                   #将里面的如404等code打印出来print(e.code)if hasattr(e, "reason"):                #将产生的错误的原因打印出来print(e.reason)return html

执行上面的函数可以得到结果如下

<!DOCTYPE html>
<html lang="zh-CN" class="ua-windows ua-webkit">
<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><meta name="renderer" content="webkit"><meta name="referrer" content="always"><meta name="google-site-verification" content="ok0wCgT20tBBgo9_zat2iAcimtN4Ftf5ccsh092Xeyw" /><title>
豆瓣电影 Top 250
</title><meta name="baidu-site-verification" content="cZdR4xxR7RxmM4zE" /><meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="Sun, 6 Mar 2005 01:00:00 GMT"
。。。。。

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

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

相关文章

【数据结构】04.双向链表

一、双向链表的结构 注意&#xff1a;这里的“带头”跟前面我们说的“头节点”是两个概念&#xff0c;带头链表里的头节点&#xff0c;实际为“哨兵位”&#xff0c;哨兵位节点不存储任何有效元素&#xff0c;只是站在这里“放哨的”。 “哨兵位”存在的意义&#xff1a;遍历循…

Roboflow自动标定数据集

最近需要自己打数据集&#xff0c;记录一下用Roboflow来打标签。 https://roboflow.com/&#xff08;官网&#xff09; 进入官网先注册&#xff0c;注册完成后进入这个界面。 我先讲如果不想让数据集公开怎么办&#xff0c;因为这里每个新建的都是公开的。新账号进去应该进去…

【数据分享】国家级旅游休闲街区数据(Excel/Shp格式/免费获取)

之前我们分享过从我国文化和旅游部官网整理的2018-2023年我国50个重点旅游城市星级饭店季度经营状况数据&#xff08;可查看之前的文章获悉详情&#xff09;&#xff01;文化和旅游部官网上也分享有很多与旅游相关的常用数据&#xff0c;我们基于官网发布的名单文件整理得到全国…

Qt Creator13配置Android开发环境

QT Creator13是目前&#xff08;2024年&#xff09;最新版本&#xff0c;配置Android开发环境有一些不一样&#xff0c;走了一些弯路&#xff0c;记录如下。 1、安装JDK和SDK 下载安装JDK和SDK&#xff0c;建议安装在无空格和中文字符的目录下。 具体安装步骤不再赘述&#…

GraalVM

文章目录 1、什么是GraalVM2、GraalVM的两种模式1_JIT模式2_AOT模式3_总结 3、应用场景1_SpringBoot搭建GraalVM应用2_函数计算3_Serverless应用 4、参数优化和故障诊断1_内存快照文件的获取2_运行时数据的获取 1、什么是GraalVM GraalVM是Oracle官方推出的一款高性能JDK&…

如何改善提示词,让 GPT-4 更高效准确地把视频内容整体转换成文章?

&#xff08;注&#xff1a;本文为小报童精选文章。已订阅小报童或加入知识星球「玉树芝兰」用户请勿重复付费&#xff09; 让我们来讨论一下大语言模型应用中的一个重要原则 ——「欲速则不达」。 作为一个自认为懒惰的人&#xff0c;我一直有一个愿望&#xff1a;完成视频制作…

Spire.PDF for .NET【文档操作】演示:以特定的缩放比例/百分比打开 PDF 文件

有时&#xff0c;我们可能需要在显示 PDF 文件时更改缩放比例以满足我们的要求。在本文中&#xff0c;我们将演示如何使用 Spire.PDF for .NET 以特定的缩放比例/百分比&#xff08;例如默认值、100% 或任何其他所需的缩放比例&#xff09;打开 PDF 文件。 Spire.PDF for .NET…

Renesas R7FA8D1BH (Cortex®-M85) I2C接口应用(OLED)

目录 概述 1 软硬件 1.1 软硬件环境信息 1.2 开发板信息 1.3 调试器信息 2 FSP和KEIL配置I2C 2.1 I2C硬件电路 2.2 FSP配置参数 3 软件功能实现 3.1 FSP生成项目 3.2 FSP中I2C接口函数 3.2.1 I2C Master的函数列表 3.2.2 函数功能介绍 3.3 I2C接口 4 验证i2c接口…

Vant Design - VUE 时间区间限制

效果图&#xff0c;限制7天 实现代码 <a-range-picker v-model"dateTime" style"width: 100%" :disabled-date"disabledDate" format"YYYY-MM-DD HH:mm:ss" :showTime"true" :placeholder"[开始时间, 结束时间]&quo…

浅析MySQL-索引篇01

什么是索引&#xff1f; 索引是帮助存储引擎快速获取数据的一种数据结构&#xff0c;类似于数据的目录。 索引的分类 按数据结构分类&#xff1a; MySQL 常见索引有 BTree 索引、HASH 索引、Full-Text 索引。 Innodb是MySQL5.5之后的默认存储引擎&#xff0c;BTree索引类型也…

量产工具一一文字系统(三)

目录 前言 一、文字数据结构抽象 1.描述一个文字的位图 2.描述一个字库操作 3.font_manager.h 二、实现Freetype封装 1.freetype.c 三、实现文字管理 1.font_manager.c 四、单元测试 1.font_test.c 2.disp_manager.c 3.disp_manager.h 4.上机测试 前言 前面我们…

从搜索框的提示词中再探防抖和节流

前言 最近逛掘金时&#xff0c;看到了一篇文章。发现是我之前写过的一篇文章主题是防抖和节流的&#xff0c;看防抖时没感觉哪里不一样&#xff0c;但是当我看到节流时发现他的节流怎么这么繁琐(・∀・(・∀・(・∀・*)&#xff1f; 抱着疑惑的想法&#xff0c;我仔细拜读了这…

深度学习简介-AI(三)

深度学习简介 深度学习简介深度学习例子深度学习训练优化1.随机初始化2.优化损失函数3.优化器选择4.选择/调整模型结构 深度学习常见概念隐含层/中间层随机初始化损失函数导数与梯度优化器Mini Batch/epoch 深度学习训练逻辑图 深度学习简介 深度学习例子 猜数字 A: 我现在心…

机器学习Day10:聚类

概念 聚类是按照某个特定标准把一个数据集分割成不同的类或簇&#xff0c;使得同一个簇内的数据对象的相似性尽可能大&#xff0c;同时不在同一个簇中的数据对象的差异性尽可能大 聚类的过程 数据准备&#xff1a;特征标准化和降维特征选择&#xff1a;从最初的特征中选择最…

rust 终端显示综合例程

文章目录 demo程序1 terminal_size2 term_grid3 crossterm3.1 style 4 lscolors准备内容4.1 LsColors 5 users5.1 获取用户/用户组信息5.2 通过缓存获取 demo程序 综合demo 各个库使用demo 1 terminal_size 一个获取终端界面大小的库&#xff0c;支持linux、macos、windows。…

keil5模拟 仿真 报错没有读写权限

debug*** error 65: access violation at 0x4002100C : no write permission 修改为&#xff1a; Dialog DLL默认是DCM3.DLL Parameter默认是-pCM3 应改为 Dialog DLL默认是DARMSTM.DLL Parameter默认是-pSTM32F103VE

【机器学习】机器学习与电商推荐系统的融合应用与性能优化新探索

文章目录 引言第一章&#xff1a;机器学习在电商推荐系统中的应用1.1 数据预处理1.1.1 数据清洗1.1.2 数据归一化1.1.3 特征工程 1.2 模型选择1.2.1 协同过滤1.2.2 矩阵分解1.2.3 基于内容的推荐1.2.4 混合推荐 1.3 模型训练1.3.1 梯度下降1.3.2 随机梯度下降1.3.3 Adam优化器 …

苹果电脑如何录屏,3个方法,帮你搞定

“最近新买了一台苹果电脑&#xff0c;但这是我第一次使用&#xff0c;有很多功能都不太了解。想问问大家苹果电脑如何录屏啊&#xff1f;可以教我一下吗&#xff1f;先提前谢谢大家啦&#xff01;” 苹果电脑以其出色的性能和独特的设计&#xff0c;深受全球用户的喜爱。而在…

Win11禁止右键菜单折叠的方法

背景 在使用windows11的时候&#xff0c;会发现默认情况下&#xff0c;右键菜单折叠了。以至于在使用一些软件的右键菜单时总是要点击“显示更多选项”菜单展开所有菜单&#xff0c;然后再点击。而且每次在显示菜单时先是全部展示&#xff0c;再隐藏一下&#xff0c;看着着实难…

源代码层面分析Appium-inspector工作原理

Appium-inspector功能 Appium Inspector 基于 Appium 框架&#xff0c;Appium 是一个开源工具&#xff0c;用于自动化移动应用&#xff08;iOS 和 Android&#xff09;和桌面应用&#xff08;Windows 和 Mac&#xff09;。Appium 采用了客户端-服务器架构&#xff0c;允许用户通…