【学习笔记】Py网络爬虫学习记录(更新中)

news2025/5/13 3:47:16

目录

一、入门实践——爬取百度网页

二、网络基础知识

1、两种渲染方式

2、HTTP解析 

三、Request入门

1、get方式 - 百度搜索/豆瓣电影排行

2、post方式 - 百度翻译

四、数据解析提取三种方式

1、re正则表达式解析

(1)常用元字符

(2)常用量词

(3)贪婪匹配和惰性匹配

(4)re模块

(5)re实战1:自定义爬取豆瓣排行榜 

(6)re实战2:爬取电影天堂


一、入门实践——爬取百度网页

from urllib.request import urlopen

url = "http://www.baidu.com"
resp = urlopen(url)

with open("mybaidu.html", mode="w",encoding="utf-8") as f:
    # 使用with语句打开(或创建)一个名为"mybaidu.html"的文件
    # 打开模式为写入("w"),编码为UTF - 8("utf-8")
    # 文件对象被赋值给变量f
    # with语句确保文件在代码块结束后会自动关闭
    f.write(resp.read().decode("utf-8"))

这段代码的功能是从百度首页获取HTML内容,并将其保存到本地文件"mybaidu.html"中

爬取结果 ↓(被禁了哈哈)

二、网络基础知识

1、两种渲染方式

服务器渲染:

  • 在服务器就直接把数据和html整合在一起,统一返回给浏览器在页面源代码中能看到数据

客户端渲染:

  • 第一次请求只要一个html骨架
  • 第二次请求拿到数据,进行数据展示在页面源代码中,看不到数据

2、HTTP解析 

请求头中最常见重要内容(爬虫需要)

  • User-Agent身份标识:请求载体的身份标识(用啥发送的请求)
  • Referer防盗链:(这次请求是从哪个页面来的?反爬会用到)
  • cookie:本地字符串数据信息(用户登录信息,反爬的token)

响应头中一些重要的内容

  • cookie:本地字符串数据信息(用户登录信息,反爬的token)
  • 各种莫名其妙的字符串(这个需要经验了,一般都是token字样,防止各种攻击和反爬) 

三、Request入门

1、get方式 - 百度搜索/豆瓣电影排行

import requests
query = input("请输入想查询的内容!")
url = f"https://www.baidu.com/s?wd={query}"

resp = requests.get(url)

dic = {
"User-Agent":
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 SLBrowser/9.0.6.2081 SLBChan/103 SLBVPV/64-bit"
}

resp = requests.get(url=url, headers=dic) #伪装成浏览器
print(resp.text)
resp.close()

爬了一下百度,成功啦! 

import requests

url = f"https://movie.douban.com/j/chart/top_list"

parm= {
    "type": 25,
    "interval_id": "100:90",
    "action":"",
    "start": 0,
    "limit": 20,
}

dic={
"User-Agent":
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 SLBrowser/9.0.6.2081 SLBChan/103 SLBVPV/64-bit"
}

resp = requests.get(url=url,params=parm,headers=dic)
print(resp.json())
resp.close()

 

2、post方式 - 百度翻译

发送post请求,发送的数据必须放在字典里,通过data参数进行传递

import requests
s = input("请输入想查询的内容!")
url = f"https://fanyi.baidu.com/sug"

dat = {
    "kw":s
}
resp = requests.get(url)

#发送post请求,发送的数据必须放在字典里,通过data参数进行传递
resp = requests.post(url=url,data=dat)
print(resp.json()) 
resp.close()

四、数据解析提取三种方式

        上述内容算入门了抓取整个网页的基本技能,但大多数情况下,我们并不需要整个网页的内容,只是需要那么一小部分,这就涉及到了数据提取的问题。
三种解析方式

  • re解析
  • bs4解析
  • xpath解析

1、re正则表达式解析

正则表达式是一种使用表达式的方式对字符串进行匹配的语法规则
抓取到的网页源代码本质上就是一个超长的字符串,想从里面提取内容,用正则再合适不过

在线正则表达式测试

(1)常用元字符

.匹配除换行符以外的任意字符
\w匹配字母数字下划线
\s匹配任意的空白符
\d匹配数字
\n匹配一个换行符
\t匹配一个制表符
^匹配字符串的开始
$匹配字符串的结尾
\W匹配非字母数字下划线

\D

匹配非数字
\S匹配非空白符
a|b匹配字符a或字符b
()匹配括号内的表达式,也表示一个组
[...]匹配字符组中的字符 [a-zA-Z0-9]
[^...]匹配除了字符组中字符的所有字符

(2)常用量词

*重复零次或更多次
+重复一次或更多次
?重复零次或一次
{n}重复n次
{n,}重复n次或更多次
{n,m}重复n到m次









 

(3)贪婪匹配和惰性匹配

.*贪婪匹配(尽可能多的匹配)
.*?惰性匹配(尽可能少的匹配)

↑ 贪婪匹配就是尽可能长地匹配

↑ 惰性匹配就是尽可能短地匹配

(4)re模块

  • findall:匹配字符串中所有符合正则的内容
  • finditer:匹配字符串中所有内容【返回的是迭代器】,从迭代器中拿到内容要.group
import re

#findall:匹配字符串中所有符合正则的内容
list = re.findall(r"\d+","我的学号是20250102,他的学号是20240105")
print(list)

#finditer:匹配字符串中所有内容【返回的是迭代器】,从迭代器中拿到内容要.group
it = re.finditer(r"\d+","我的学号是20250102,他的学号是20240105")
for i in it:
    print(i.group())
  • search:找到一个结果就返回,返回的结果是match对象,拿数据要.group()
  • match:从头开始匹配
  • 预加载正则表达式
import re

#search:找到一个结果就返回,返回的结果是match对象,拿数据要.group()
s = re.search(r"\d+","我的学号是20250102,他的学号是20240105")
print(s.group())

#match:从头开始匹配
m = re.search(r"\d+","20250102,他的学号是20240105")
print(s.group())

#预加载正则表达式
obj = re.compile(r"\d+") #相对于把头写好,后面直接补上字符串
ret = obj.finditer("我的学号是20250102,他的学号是20240105")
for i in ret:
    print(i.group())
  •  ?P<起的别名>正则表达式:给提取的内容起别名,例如?P<name>.*?,给.*?匹配到的内容起别名name
s = """
<div class='cat'><span id='1'>凯蒂猫</span></div>
<div class='dog'><span id='2'>史努比</span></div>
<div class='mouse'><span id='3'>杰瑞</span></div>
<div class='fish'><span id='4'>小鲤鱼</span></div>
"""

obj = re.compile(r"<div class='(?P<class>.*?)'><span id='(?P<id>.*?)'>(?P<name>.*?)</span></div>",re.S)
#re.S:让.能匹配换行符
result = obj.finditer(s)
for it in result:
    print(it.group("id") +" "+ it.group("class") +" "+ it.group("name"))

(5)re实战1:自定义爬取豆瓣排行榜 

 通过request拿到页面源代码,用re正则匹配提取数据

import re
import csv
import requests

#request获取页面源代码
url = "https://movie.douban.com/top250?start=%d&filter="
num = int(input("请问您想要查询豆瓣电影Top榜单前多少页的信息:"))

for i in range(0,num): #第1页=0*25,第二页=1*25…… range范围[a,b)
    i=i*25
new_url = format(url%i) #用值i替换url中的变量,形成新的url

dic = {
"User-Agent":
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 SLBrowser/9.0.6.2081 SLBChan/103 SLBVPV/64-bit"
}
resp = requests.get(url=new_url,headers=dic)
page_content = resp.text

#re提取数据
obj = re.compile(r'<li>.*?<div class="item">.*?<span class="title">(?P<name>.*?)</span>'
                 r'.*?<p>(?P<daoyan>.*?)&nbsp.*?<br>(?P<year>.*?)&nbsp.*?'
                 r'<span class="rating_num" property="v:average">(?P<score>.*?)</span>'
                 r'.*?<span>(?P<people>.*?)人评价</span>',re.S)

res = obj.finditer(page_content)
f = open("movie.csv","a",encoding="utf-8")
csvWriter = csv.writer(f) #将文件转为csv写入
for item in res:
    dic = item.groupdict() #把获取的数据转换成字典
    dic['year'] = dic['year'].strip() #去除字符串首尾的指定字符
    dic['daoyan'] = dic['daoyan'].strip()
    csvWriter.writerow(dic.values())

f.close()
resp.close()
print("over!")

(6)re实战2:爬取电影天堂

import re
import csv
from urllib.parse import urljoin

import requests

#request获取页面源代码
domain_url = "https://dydytt.net/index.htm"

dic = {
"User-Agent":
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 SLBrowser/9.0.6.2081 SLBChan/103 SLBVPV/64-bit"
}
resp = requests.get(url=domain_url,headers=dic,verify=False)
resp.encoding = "gb2312"
main_page_ct = resp.text

#re匹配数据
obj1 = re.compile(r"最新电影更新.*?<ul>(?P<url>.*?)</ul>",re.S)
obj2 = re.compile(r"<a href='(?P<href>.*?)'>",re.S)
obj3 = re.compile(r'<title>(?P<name>.*?)</title>'
                 r'.*?磁力链下载器:<a href="(?P<down>.*?) target="_blank"  title="qBittorrent">',re.S)

res1 = obj2.finditer(main_page_ct)

f = open("dyttmovie.csv","a",encoding="utf-8")
csvWriter = csv.writer(f) #将文件转为csv写入

#1.提取页面子链接
res2 = obj2.finditer(main_page_ct)
child_href_list = []
for i in res2:
    #拼接子页面连接
    child_url = urljoin(domain_url,i.group('href'))
    child_href_list.append(child_url)

#2.提取子页面内容
for i in child_href_list:
    child_resp = requests.get(url=i,headers=dic,verify=False) #获取子页面url
    child_resp.encoding = 'gb2312'
    res3 = obj3.search(child_resp.text) #提取子页面数据
    tdic = res3.groupdict()
    csvWriter.writerow(tdic.values()) #存入文件


f.close()
resp.close()
print("over!")

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

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

相关文章

旅游资源网站登录(jsp+ssm+mysql5.x)

旅游资源网站登录(jspssmmysql5.x) 旅游资源网站是一个为旅游爱好者提供全面服务的平台。网站登录界面简洁明了&#xff0c;用户可以选择以管理员或普通用户身份登录。成功登录后&#xff0c;用户可以访问个人中心&#xff0c;进行修改密码和个人信息管理。用户管理模块允许管…

C语言链接数据库

目录 使用 yum 配置 mysqld 环境 查看 mysqld 服务的版本 创建 mysql 句柄 链接数据库 使用数据库 增加数据 修改数据 查询数据 获取查询结果的行数 获取查询结果的列数 获取查询结果的列名 获取查询结果所有数据 断开链接 C语言访问mysql数据库整体源码 通过…

中间件--ClickHouse-9--MPP架构(分布式计算架构)

1、MPP 架构基础概念 MPP(Massively Parallel Processing 大规模并行处理) 是一种分布式计算架构&#xff0c;专门设计用来高效处理大规模数据集。在这种架构下*&#xff0c;数据库被分割成多个部分&#xff0c;每个部分可以在不同的服务器节点上并行处理*。这意味着&#xff…

分布式计算领域的前沿工具:Ray、Kubeflow与Spark的对比与协同

在当今机器学习和大数据领域&#xff0c;分布式计算已成为解决大规模计算问题的关键技术。本文将深入探讨三种主流分布式计算框架——Ray、Kubeflow和Spark&#xff0c;分析它们各自的特点、应用场景以及如何结合它们的优势创建更强大的计算平台。 Spark批量清洗快&#xff0c;…

每天学一个 Linux 命令(20):find

​​可访问网站查看,视觉品味拉满: http://www.616vip.cn/20/index.html find 是 Linux 系统中最强大的文件搜索工具之一,支持按名称、类型、时间、大小、权限等多种条件查找文件,并支持对搜索结果执行操作(如删除、复制、执行命令等)。掌握 find 可大幅提升文件管理效率…

Winform发展历程

Windows Forms (WinForms) 发展历程 起源与背景&#xff08;1998-2002&#xff09; Windows Forms&#xff08;简称WinForms&#xff09;是微软公司推出的基于.NET Framework的GUI&#xff08;图形用户界面&#xff09;开发框架&#xff0c;于2002年随着.NET Framework 1.0的…

npx 的作用以及延伸知识(.bin目录,npm run xx 执行)

文章目录 前言原理解析1. npx 的作用2. 为什么会有 node_modules/.bin/lerna3. npx 的查找顺序4. 执行流程总结1&#xff1a; 1. .bin 机制什么是 node_modules/.bin&#xff1f;例子 2. npx 的底层实现npx 是如何工作的&#xff1f;为什么推荐用 npx&#xff1f;npx 的特殊能力…

本地部署DeepSeek-R1(Dify升级最新版本、新增插件功能、过滤推理思考过程)

下载最新版本Dify Dify1.0版本之前不支持插件功能&#xff0c;先升级DIfy 下载最新版本&#xff0c;目前1.0.1 Git地址&#xff1a;https://github.com/langgenius/dify/releases/tag/1.0.1 我这里下载到老版本同一个目录并解压 拷贝老数据 需先停用老版本Dify PS D:\D…

【ubuntu】在Linux Yocto的基础上去适配Ubuntu的wifi模块

一、修改wifi的节点名 1.找到wifi模块的PID和VID ifconfig查看wifi模块网络节点的名字&#xff0c;发现是wlx44876393bb3a&#xff08;wlxmac地址&#xff09; 通过udevadm info -a /sys/class/net/wlx44876393bba路径的命令去查看wlx44876393bba的总线号&#xff0c;端口号…

25软考新版系统分析师怎么备考?重点考哪些?(附新版备考资源)

软考系统分析师&#xff08;高级资格&#xff09;考试涉及知识面广、难度较大&#xff0c;需要系统化的复习策略。以下是结合考试大纲和历年真题整理的复习重点及方法&#xff1a; 一、明确考试结构与分值分布 1.综合知识&#xff08;选择题&#xff0c;75分&#xff09; 2…

PyTorch入门------卷积神经网络

前言 参考&#xff1a;神经网络 — PyTorch Tutorials 2.6.0cu124 文档 - PyTorch 深度学习库 一个典型的神经网络训练过程如下&#xff1a; 定义一个包含可学习参数&#xff08;或权重&#xff09;的神经网络 遍历输入数据集 将输入通过神经网络处理 计算损失&#xff08;即…

Edge浏览器安卓版流畅度与广告拦截功能评测【不卡还净】

安卓设备上使用浏览器的体验&#xff0c;很大程度取决于两个方面。一个是滑动和页面切换时的反应速度&#xff0c;另一个是广告干扰的多少。Edge浏览器的安卓版本在这两方面的表现比较稳定&#xff0c;适合日常使用和内容浏览。 先看流畅度。Edge在中端和高端机型上启动速度快&…

Docker 和 Docker Compose 使用指南

Docker 和 Docker Compose 使用指南 一、Docker 核心概念 镜像&#xff08;Image&#xff09; &#xff1a;应用的静态模板&#xff08;如 nginx:latest​&#xff09;。容器&#xff08;Container&#xff09; &#xff1a;镜像的运行实例。仓库&#xff08;Registry&#xf…

vue3环境搭建、nodejs22.x安装、yarn 1全局安装、npm切换yarn 1、yarn 1 切换npm

vue3环境搭建 node.js 安装 验证nodejs是否安装成功 # 检测node.js 是否安装成功----cmd命令提示符中执行 node -v npm -v 设置全局安装包保存路径、全局装包缓存路径 在node.js 安装路径下 创建 node_global 和 node_cache # 设置npm全局安装包保存路径&#xff08;新版本…

Python人工智能 使用可视图方法转换时间序列为复杂网络

基于可视图方法的时间序列复杂网络转换实践 引言 在人工智能与数据科学领域&#xff0c;时间序列分析是一项基础且重要的技术。本文将介绍一种创新的时间序列分析方法——可视图方法&#xff0c;该方法能将时间序列转换为复杂网络&#xff0c;从而利用复杂网络理论进行更深入…

spring:加载配置类

在前面的学习中&#xff0c;通过读取xml文件将类加载&#xff0c;或他通过xml扫描包&#xff0c;将包中的类加载。无论如何都需要通过读取xml才能够进行后续操作。 在此创建配置类。通过对配置类的读取替代xml的功能。 配置类就是Java类&#xff0c;有以下内容需要执行&#…

从零搭建一套前端开发环境

一、基础环境搭建 1.NVM(Node Version Manager)安装 简介 nvm&#xff08;Node Version Manager&#xff09; 是一个用于管理多个 Node.js 版本的工具&#xff0c;允许开发者在同一台机器上轻松安装、切换和使用不同版本的 Node.js。它特别适合需要同时维护多个项目&#xff…

金融数据库转型实战读后感

荣幸收到老友太保科技有限公司数智研究院首席专家林春的签名赠书。 这是国内第一本关于OceanBase数据库实际替换过程总结的的实战书。打个比方可以说是从战场上下来分享战斗经验。读后感受颇深。我在这里讲讲我的感受。 第三章中提到的应用改造如何降本。应用改造是国产化替换…

代码审计系列2:小众cms oldcms

目录 sql注入 1. admin/admin.php Login_check 2. admin/application/label/index.php 3. admin/application/hr/index.php 4. admin/application/feedback/index.php 5. admin/application/article/index.php​ sql注入 1. admin/admin.php Login_check 先看一下p…

Cursor + MCP,实现自然语言操作 GitLab 仓库

本分分享如何使用 cursor mcp 来操作极狐GitLab 仓库&#xff0c;体验用自然语言在不接触极狐GitLab 的情况下来完成一些仓库操作。 极狐GitLab 是 GitLab 在中国的发行版&#xff0c;关于中文参考文档和资料有&#xff1a; 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitL…