Python爬虫快速入门
Python 爬虫Sutdy
1.基本类库
request(请求)
- 引入
from urllib import request
- 定义url路径
url="http://www.baidu.com"
- 进行请求,返回一个响应对象response
response=request.urlopen(url)
- 读取响应体read()以字节形式打印网页源码
response.read()
转码
编码 文本–byte encode
解码 byte–文本 decode
#将上方转为文本 text=response.read().decode("utf-8") # 打印为源码文本显示print(text)
写入
语法:with open (‘文件名’,‘w’,设定编码格式) as fp: fp.write(文本) w代表写入
with open ('命名.html','w',encoding='utf-8') as fp:fp.write(text)
读取
读取响应体内容并转为utf-8格式
response.read().decode("utf-8")
- 读取状态
response.getcode()
读取请求路径
response.geturl()
- 读取响应头
response.getheaders()
parse(url编码)
在开始网页请求之前需保证编码格式~
- 引入
from urllib import parse
使用测试
quote(编码)
#编码 result=parse.quote("小鲁班")
unquote(解码)
#解码 result1=parse.unquote("%E9%E1%3E")
- 给多个参数编码方式1 变量名.format()
url2="http://www.baidu.com?name={}&pwd={}" url1=url2.format(parse.quote('用户名'),parse.quote('密码'))
- 给多个参数编码方式2 urlencode
obj={ "name":"肖", "password":"213123丽华", "age":"五十岁" } base_url="http://www.baidu.com/s?" params=parse.urlencode(obj) url=base_url+params
urlretrieve(便捷的下载方式)
request.urlretrieve('图片路径','保存路径')
伪装成浏览器访问的样子
封装一个请求对象
请求对象可以携带除了url之外的一切服务器感兴趣的信息,例如cookie、UA等等…
url="http://www.baidu.com/" # 定义headers headers={'User-Agent':"Mozilla/5.0 (Linux; Android 11; Pixel 5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.91 Mobile Safari/537.36" } req=request.Request(url=url,headers=header)# 将请求对象传入 response=request.urlopen(req)
2.爬取各种常见的URL
如何找到正确的URL
- 直接获取浏览器的地址栏url
- 地址栏url不是固定,需要手动配置
- 有效地址不在地址栏中,而在Network(网络)中后台加载
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eAY6WTRm-1650877844184)(D:\StudyHard\assets\1650638350731.png)]
- 等等…
URL分为GET POST
返回值分为XML(HTML),JSON
处理post/get请求
案例:抓取百度翻译
找到URL
post_url="https://fanyi.baidu.com/sug"
POST请求表单参数
data_dict={"kw":"sogreat" }
请求前需要做一次url编码
data=parse.urlencode(data_dict)
参数必须是bytes
data=data.encode("utf-8")
封装请求对象
rq=erquset.Request(url=post_url,headers={},data=data)response=requset.urlopen(rq) text=response.read().decode('utf-8')
最终结果是个符合JSON格式的字符串
- json格式字符串用json解析
- xml格式字符串用xml解析
进一步解析它转JSON
# 引入 import json json_obj=json.loads(text,encoding='utf-8') # 打印结果为json格式的数据 print(json_obj) # 并且可进行遍历 for...in for s in json_obj["data"] # data为json数据中的一个属性 print(s) #循环打印出data的每个值
案例:抓取KFC餐厅地址信息
找到请求地址与post请求参数
实现:
# 肯德基店铺位置 http://www.kfc.com.cn/kfccda/storelist/index.aspx #请求头优先级 UA-->cookie--->Refer--->其他 headers1={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36 Edg/100.0.1185.44" } newaddr=input("请输入地址:") KFCurl="http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword" pageindex=1 # 使用循环查出所有的数据~ while True:datas={"cname":"","pid":"","pageIndex": pageindex,"pageSize": 10,"keyword": newaddr}#编译转码data=parse.urlencode(data)data=data.encode(encoding="utf-8")req1=request.Request(url=url,headers=headers,data=data)response1=request.urlopen(req1)address=response1.read().decode('utf-8')address1=json.loads(address) #转jsonif len(address1['Table1']) == 0:break #表示没数据了for addr in address1['Table1']:print(addr)pageindex+=1
优化:使用模块化管理 def 模块名(参数名): 可把它看作封装方法–相当于js的函数
#请求头优先级 UA-->cookie--->Refer--->其他 headers1={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36 Edg/100.0.1185.44" } newaddr=input("请输入地址:") #url对象准备模块 def prepare_url(url,headers,data):#编译转码data=parse.urlencode(data)data=data.encode(encoding="utf-8")req1=request.Request(url=url,headers=headers,data=data)return req1 #请求数据模块 def request_with_url(reqs):response1=request.urlopen(reqs)address=response1.read().decode('utf-8')return address #对响应内容解析模块 def pare_data(text):address1=json.loads(text) #转jsonif len(address1['Table1']) == 0:return 'null' #表示没数据了for addr in address1['Table1']:print(addr) KFCurl="http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword" pageindex=1 # 使用循环查出所有的数据~ while True:datas={"cname":"","pid":"","pageIndex": pageindex,"pageSize": 10,"keyword": newaddr}reqs=prepare_url(KFCurl,headers1,datas)text=request_with_url(reqs)if(pare_data(text)=="null"):breakpageindex+=1
案例:抓取百度贴吧信息(get)
headers1={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36 Edg/100.0.1185.44"
}
#第一页 https://tieba.baidu.com/f?kw=%E6%96%97%E7%BD%97%E5%A4%A7%E9%99%86&ie=utf-8&pn=0
#第二页 https://tieba.baidu.com/f?kw=%E6%96%97%E7%BD%97%E5%A4%A7%E9%99%86&ie=utf-8&pn=50
#第三页 https://tieba.baidu.com/f?kw=%E6%96%97%E7%BD%97%E5%A4%A7%E9%99%86&ie=utf-8&pn=100
#规律:pn=(page-1)*50
start_page=1
end_page=5
input_name="%E6%96%97%E7%BD%97%E5%A4%A7%E9%99%86"#斗罗大陆
for page in range(start_page,end_page+1):url="https://tieba.baidu.com/f?kw{}=&ie=utf-8&pn={}".format(input_name,(page-1)*50)request=urllib.request.Request(url=url,headers=headers1)response=urllib.request.urlopen(request)text=response.read().decode('utf-8')file_path="page{}.html".format(page)with open(file_path,'w',encoding="utf-8") as fp:fp.write(text)print(file_path,"下载完毕")
print("所有内容下载完毕")
处理Ajax请求
案例:爬取豆瓣电影动画排行榜
# 定义headers headers={'User-Agent':"Mozilla/5.0 (Linux; Android 11; Pixel 5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.91 Mobile Safari/537.36" }# 1 0----2 20----3 40----得出:(p-1)*20# page=input("请输入你要查询动画类型的排行榜前几页") # print(page) base_url="https://movie.douban.com/j/new_search_subjects?sort=U&range=0,10&tags=&start={}&genres=%E5%8A%A8%E7%94%BB" for p in range(0,4):total=p*20url=base_url.format(total)req=request.Request(url=url,headers=headers)response=request.urlopen(req)text=response.read().decode('utf-8')#转jsonjson_obj=json.loads(text)#只打印部分属性for val in json_obj['data']:title=val['title']rate=val['rate']print("title:{},rate:{}".format(title,rate))
相关文章:
Python爬虫快速入门
Python 爬虫Sutdy 1.基本类库 request(请求) 引入 from urllib import request定义url路径 url"http://www.baidu.com"进行请求,返回一个响应对象response responserequest.urlopen(url)读取响应体read()以字节形式打印网页源码 response.read()转码 编码 文本–by…...
部署MinIO
一、安装部署MINIO 1.1 下载 wget https://dl.min.io/server/minio/release/linux-arm64/minio chmod x minio mv minio /usr/local/bin/ # 控制台启动可参考如下命令, 守护进程启动请看下一个代码块 # ./minio server /data /data --console-address ":9001"1.2 配…...
RK3566环境搭建
环境:vmware16,ubuntu 18.04 安装依赖库: sudo apt-get install repo git ssh make gcc libssl-dev liblz4-tool expect g patchelf chrpath gawk texinfo chrpath diffstat binfmt-support qemu-user-static live-build bison flex fakero…...
精确掌控并发:滑动时间窗口算法在分布式环境下并发流量控制的设计与实现
这是《百图解码支付系统设计与实现》专栏系列文章中的第(15)篇,也是流量控制系列的第(2)篇。点击上方关注,深入了解支付系统的方方面面。 上一篇介绍了固定时间窗口算法在支付渠道限流的应用以及使用redis…...
Python展示 RGB立方体的二维切面视图
代码实现 import numpy as np import matplotlib.pyplot as plt# 生成 24-bit 全彩 RGB 立方体 def generate_rgb_cube():# 初始化一个 256x256x256 的三维数组rgb_cube np.zeros((256, 256, 256, 3), dtypenp.uint8)# 填充立方体for r in range(256):for g in range(256):fo…...
03 顺序表
目录 线性表顺序表练习 线性表(Linear list)是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串。。。 线性表在逻辑上时线性结构,是连续的一条直线。但在物理结…...
2023年全球软件开发大会(QCon北京站2023)9月:核心内容与学习收获(附大会核心PPT下载)
随着科技的飞速发展,全球软件开发大会(QCon)作为行业领先的技术盛会,为世界各地的专业人士提供了交流与学习的平台。本次大会汇集了全球的软件开发者、架构师、项目经理等,共同探讨软件开发的最新趋势、技术与实践。本…...
ChatGPT 和 文心一言 的优缺点及需求和使用场景
ChatGPT和文心一言是两种不同的自然语言生成模型,它们有各自的优点和缺点。 ChatGPT(Generative Pre-trained Transformer)是由OpenAI开发的生成式AI模型,它在庞大的文本数据集上进行了预训练,并可以根据输入生成具有上…...
架构师之超时未支付的订单进行取消操作的几种解决方案
今天给大家上一盘硬菜,并且是支付中非常重要的一个技术解决方案,有这块业务的同学注意自己尝试一把哈! 一、需求如下: 生成订单30分钟未支付,自动取消 生成订单60秒后,给用户发短信 对上述的需求,我们给…...
【容器固化】 OS技术之OpenStack容器固化的实现原理及操作
1. Docker简介 要学习容器固化,那么必须要先了解下Docker容器技术。Docker是基于GO语言实现的云开源项目,通过对应用软件的封装、分发、部署、运行等生命周期的管理,达到应用组件级别的“一次封装,到处运行”。这里的应用软件&am…...
设置 SSH 通过密钥登录
我们一般使用 PuTTY 等 SSH 客户端来远程管理 Linux 服务器。但是,一般的密码方式登录,容易有密码被暴力破解的问题。所以,一般我们会将 SSH 的端口设置为默认的 22 以外的端口,或者禁用 root 账户登录。其实,有一个更…...
1.6 面试经典150题 - 买卖股票的最佳时机
买卖股票的最佳时机 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从这笔交易…...
locust快速入门--使用分布式提高测试压力
背景: 使用默认的locust启动命令进行压测时,尽管已经将用户数设置大比较大(400),但是压测的时候RPS一直在100左右。需要增加压测的压力。 问题原因: 如果你是通过命令行启动的或者参考之前文章的启动方式…...
K8s(三)Pod资源——pod亲和性与反亲和性,pod重启策略
目录 pod亲和性与反亲和性 pod亲和性 pod反亲和性 pod状态与重启策略 pod状态 pod重启策略 本文主要介绍了pod资源与pod相关的亲和性,以及pod的重启策略 pod亲和性与反亲和性 pod亲和性(podAffinity)有两种 1.podaffinity,…...
免费的域名要不要?
前言 eu.org的免费域名相比于其他免费域名注册服务,eu.org的域名后缀更加独特。同时,eu.org的域名注册也比较简单,只需要填写一些基本信息,就可以获得自己的免费域名。 博客地址 免费的域名要不要?-雪饼前言 eu.org…...
高通sm7250与765G芯片是什么关系?(一百八十一)
简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…...
[Python进阶] Python操作MySQL数据库:pymysql
7.7 操作MySQL数据库:pymysql 7.7.1 准备工作(创建mysql数据库) PHPStudy介绍: phpstudy是一款非常有用的PHP开发工具,旨在帮助开发者更加便捷地进行PHP程序的开发与调试。它提供了一个友好的图形用户界面,使得用户能够方便地进…...
Vue3实现带点击外部关闭对应弹出框(可共用一个变量)
首先,假设您在单文件组件(SFC)中使用了Vue3,并且有两个div元素分别通过v-if和v-else来切换显示一个带有.elpopver类的弹出组件。在这种情况下,每个弹出组件应当拥有独立的状态管理(例如:各自的isOpen变量)。…...
可视化试题(一)
1. 从可视化系统设计的角度出发,通常需要根据系统将要完成的任务的类型选择交互技术。按照任务类型分类可以将数据可视化中的交互技术分为选择、( 重新配置 )、重新编码、导航、关联、( 过滤 )、概览和细节等八…...
RHCE 【在openEuler系统中搭建基本论坛(网站)】
目录 网站需求: 准备工作: 1.基于域名[www.openlab.com](http://www.openlab.com)可以访问网站内容为 welcome to openlab!!! 测试: 2.给该公司创建三个子界面分别显示学生信息,教学资料和缴费网站,基于[www.openla…...
20240112让移远mini-PCIE接口的4G模块EC20在Firefly的AIO-3399J开发板的Android11下跑通【DTS部分】
20240112让移远mini-PCIE接口的4G模块EC20在Firefly的AIO-3399J开发板的Android11下跑通【DTS部分】 2024/1/12 16:20 https://blog.csdn.net/u010164190/article/details/79096345 [Android6.0][RK3399] PCIe 接口 4G模块 EC20 调试记录 https://blog.csdn.net/hnjztyx/artic…...
日志采集传输框架之 Flume,将监听端口数据发送至Kafka
1、简介 Flume 是 Cloudera 提供的一个高可用的,高可靠的,分布式的海量日志采集、聚合和传 输的系统。Flume 基于流式架构,主要有以下几个部分组成。 主要组件介绍: 1)、Flume Agent 是一个 JVM 进程…...
关于Vue前端接口对接的思考
关于Vue前端接口对接的思考 目录概述需求: 设计思路实现思路分析1.vue 组件分类和获取数值的方式2.http 通信方式 分类 如何对接3.vue 组件分类和赋值方式, 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your p…...
【设计模式之美】SOLID 原则之三:里式替换(LSP)跟多态有何区别?如何理解LSP中子类遵守父类的约定
文章目录 一. 如何理解“里式替换原则”?二. 哪些代码明显违背了 LSP?三. 回顾 一. 如何理解“里式替换原则”? 子类对象能够替换程序中父类对象出现的任何地方,并且保证原来程序的逻辑行为不变及正确性不被破坏。 里氏替换原则…...
代码随想录第六十三天——被围绕的区域,太平洋大西洋水流问题,最大人工岛
leetcode 130. 被围绕的区域 题目链接:被围绕的区域 步骤一:深搜或者广搜将地图周边的’O’全部改成’A’ 步骤二:遍历地图,将’O’全部改成’X’,将’A’改回’O’ class Solution { private:int dir[4][2] {-1, 0…...
Docker 项目如何使用 Dockerfile 构建镜像?
1、Docker 和 Dockerfile 的重要性 1.1、Docker 简介:讲述 Docker 的起源、它是如何革新现代软件开发的,以及它为开发者和运维团队带来的好处。重点强调 Docker 的轻量级特性和它在提高应用部署、扩展和隔离方面的优势。 本文已收录于,我的…...
实践学习PaddleScience飞桨科学工具包
实践学习PaddleScience飞桨科学工具包 动手实践,在实践中学习!本项目可以在AIStudio平台一键运行!地址:https://aistudio.baidu.com/projectdetail/4278591 本项目第一次执行会报错,再执行一次即可。若碰到莫名其妙的…...
Vue 中修改 Element 组件的 下拉菜单(Dropdown) 的样式
Vue 中修改 Element 组件的 下拉菜单(Dropdown) 的样式 今天在项目中碰到一个 UI 改造的需求,需要根据设计图把页面升级成 UI 设计师提供的设计图样式。 到最后页面改造完了,但是 UI 提供的下拉菜单样式全部是黑色半透明的,只能硬着头皮改了。…...
达梦数据库主备集群
1:服务器硬件需求 按实际业务需求,选择合适的服务器,准备 3 台服务器,一台主库服务器,一台备库服务器,一台监视器服务器,服务器参数建议如下: 硬件要求物理内存>16 GB交换区Swa…...
Spark Doris Connector 可以支持通过 Spark 读取 Doris 数据类型不兼容报错解决
1、版本介绍: doris版本: 1.2.8Spark Connector for Apache Doris 版本: spark-doris-connector-3.3_2.12-1.3.0.jar:1.3.0-SNAPSHOTspark版本:spark-3.3.1 2、Spark Doris Connector Spark Doris Connector - Apache Doris 目…...
湘潭外包网络推广公司/seo推广是什么意思
多线程 当我们写的爬虫是单线程的时候,一旦到一个地方卡的不动了,那就永远的等下去吧,我们可以使用多线程来改变这个问题。 爬虫使用多线程来处理网络请求,使用线程来处理URL队列中的url,然后将url返回的结果保存再另…...
亚当学院网站建设视频教程/典型十大优秀网络营销案例
写在前面 我们先回顾一下数组中的forEach方法吧。在数组的实例上有个forEach方法供所有实例使用,forEach里面接收一个回调函数,而且回调函数默认接收三个参数:当前项,索引,数组 。forEach循环有个特点,就是…...
wordpress默认密码/小红书代运营
毕业论文 基于微信小程序在线电子书阅读系统 开题报告 学 院: 专 业: 年 级: 学生姓名: 指导教师: …...
wordpress斜杠自动成-/seo网站课程
一、场景 相信很多phper都会遇到这样的场景,操作数据库一次性请求返回结果集过大,而又需要对结果集进行处理从而导致PHP内存开销过大。当然如果你使用过ThinkPHP和Laravel框架(其他框架或许也有类似方法,未使用过尚不清ÿ…...
联想电脑建设网站前的市场分析/网站运营策划书
如果不想看文章的话可以直接到Github下载Demo源码。下载源码后只需要修改com.qinyejun.apppaydemo.wxapi.Constants.java文件中的相关账号即可运行。 开发者账号 要在App中集成微信支付的话,首先需要到微信开放平台注册开发者账号。注意是「微信开放平台」…...
做电商网站价钱/如何推广引流
目录 简介 常用单位 lp/mm(line-pairs/mm) Cycle / pixel LW/PH(line widths/ picture height) 转换关系 MTF MTF概念 MTF50,MTF50P SFR的计算方法 参考资料: 简介 在镜头选型或者对比中&…...