网络爬虫入门(学习笔记)

爬取网页源代码

        抓取百度首页的HTML源代码,并将其保存到一个名为baidu.html的文件中。打开这个文件,可以看到一个和百度首页一模一样的页面。

from urllib.request import urlopen# 发送请求并获取响应
response = urlopen("http://www.baidu.com")# 读取响应内容并解码为字符串
web_content = response.read().decode("utf-8")# 将抓取到的网页内容保存到文件中
with open("baidu.html", mode="w", encoding="utf-8") as file:file.write(web_content)

网页请求过程

F12的使用、HTTP协议

        可以使用Chrome浏览器,按下F12打开开发者工具。

Elments:JavaScript代码以及用户操作之后显示的页面效果
Console:运行JavaScript代码片段,显示网页运行时的日志、错误和警告信息

Sources:查看和调试网页的源代码文件

Network:查看网页的所有网络请求

         HTTP(HyperText Transfer Protocol,超文本传输协议)是用于传输超文本(如HTML)的应用层协议,是现代Web通信的基础。它定义了客户端(如Web浏览器)和服务器之间如何请求和传递数据。
        HTTP协议把一条消息分为三大块内容,无论是请求还是响应都是三块内容。 

  • 请求行:请求方式(get/post),请求url地址,协议版本
  • 请求头:提供了附加信息,帮助服务器处理请求
  • 请求体 :一般放一些请求参数
  • 状态行 :协议版本,状态码,状态文本 
  • 响应头:提供了一些附加信息,帮助客户端处理响应
  • 响应体 :服务器返回的真正客户端要用的内容(HTML,json)等

求头的重要内容

  • User-Agent:标识请求的来源,告诉服务器客户端的身份
  • Referer:指示当前请求的来源页面URL,用于防盗链和反爬虫,服务器可以通过Referer头判断请求是否合

  • Cookie:存储和传递会话信息和用户信息,通常用于身份验证和跟踪用户状态。在爬虫中,通过设置合适的Cookie,可以模拟登录后的状态,访问需要身份验证的页面。

响应头的重要内容

  • cookie: 本地字符串数据信息(用户登录信息, 反爬的token)
  • 各种字符串,防止攻击和反爬

请求方式

  • GET

    • 作用:请求从服务器获取资源。
    • 特点:参数包含在URL中,适合请求静态资源或查询操作。
    • 用途:爬取网页内容,获取数据。
  • POST

    • 作用:向服务器提交数据。
    • 特点:参数包含在请求体中,适合提交表单、上传文件等操作。
    • 用途:模拟用户登录,提交表单数据。

requests入门

案例1:搜狗搜索——保存搜索内容的页面 

import requests
import time
import random# 提示用户输入搜索关键字
search_query = input("请输入你要搜索的内容:")# 构造请求URL
url = f"https://www.sogou.com/web?query={search_query}"# 定义请求头,模拟浏览器请求
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) ""AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 ""Edg/126.0.0.0 ","Referer": "https://www.sogou.com/","Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6","Accept-Encoding": "gzip, deflate, br, zstd"
}# 使用会话对象来管理Cookies和保持状态
session = requests.Session()# 发送GET请求并获取响应
response = session.get(url, headers=headers)# 检查响应状态码,确保请求成功
if response.status_code == 200:# 打开一个文件,用于保存响应内容with open("sogou_search_results.html", mode="w", encoding="utf-8") as file:# 将响应内容写入文件file.write(response.text)print("搜索结果已保存到sogou_search_results.html文件中。")
else:# 如果请求失败,打印错误信息print(f"请求失败,状态码: {response.status_code}")# 增加请求间隔,模拟真实用户行为
time.sleep(random.uniform(1, 3))

请输入你要搜索的内容:你好
搜索结果已保存到sogou_search_results.html文件中。 

案例2:百度翻译——获取翻译后的内容

import requests# 提示用户输入要翻译的英语单词
english_word = input("请输入你要翻译的英语单词:")# 准备POST请求的数据
data = {"kw": english_word  # 请求参数,与抓包工具里的参数一致
}# 发送POST请求到百度翻译的sug接口
response = requests.post("https://fanyi.baidu.com/sug", data=data)# 解析返回的JSON数据
response_json = response.json()# 打印返回字典中第一个数据的翻译内容
if response.status_code == 200:if 'data' in response_json:first_translation = response_json['data'][0]['v']print(f"翻译结果: {first_translation}")else:print("未找到相关翻译结果。")
else:print(f"请求失败,状态码: {response.status_code}")

请输入你要翻译的英语单词:hello
翻译结果: int. 打招呼; 哈喽,喂; 你好,您好; 表示问候 n. “喂”的招呼声或问候声 vi. 喊“喂

案例3:豆瓣电影——保存豆瓣电影分类排行榜(剧情片 )的top100

import csv
import requests# 请求URL和参数
url = 'https://movie.douban.com/j/chart/top_list'
params = {'type': '11',        # 类型,这里是剧情片类型'interval_id': '100:90',  # 评分区间,表示评分在90到100之间'action': '',        # 动作参数,此处为空'start': '0',        # 开始取数据的索引,从第一部电影开始取'limit': '100',       # 每次取出的电影数量
}headers = {'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ""(KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0"
}# 发送GET请求并获取响应
response = requests.get(url=url, params=params, headers=headers)# 将响应内容保存为JSON文件
if response.status_code == 200:data = response.json()with open('./douban_movies.csv', 'w', encoding='utf-8', newline='') as csvfile:fieldnames = ['rank', 'title', 'score', 'types', 'regions', 'release_date', 'actors']writer = csv.DictWriter(csvfile, fieldnames=fieldnames)writer.writeheader()for movie in data:writer.writerow({'rank': movie['rank'],'title': movie['title'],'score': movie['score'],'types': '/'.join(movie['types']),'regions': '/'.join(movie['regions']),'release_date': movie['release_date'],'actors': '/'.join(movie['actors']),})print('电影数据已保存到 douban_movies.csv 文件中。')
else:print(f'请求失败,状态码: {response.status_code}')

电影数据已保存到 douban_movies.csv 文件中。

案例4:下载图片——从豆瓣电影网站中下载一张海报 

import requestsdef download_image(url, file_name):try:# 发送GET请求获取图片数据response = requests.get(url)if response.status_code == 200:# 从URL中提取文件名作为保存的文件名,将图片内容写入文件with open(file_name, mode="wb") as f:f.write(response.content)    # 字节print(f"图片已保存为 {file_name}")else:print(f"请求失败,状态码: {response.status_code}")except requests.exceptions.RequestException as e:print(f"请求异常: {e}")# 示例:从豆瓣中下载一张电影海报
image_url = "https://img3.doubanio.com/view/photo/s_ratio_poster/public/p480747492.jpg"
file_name = "Example.jpg"download_image(image_url, file_name)

图片已保存为 Example.jpg 

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

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

相关文章

jenkins+gitlab+harbor+maven自动化容器部署

一、gitlab安装配置 1.1、安装 由于比较懒啊!这里就直接使用docker安装了啊! 没事先更新一个yum源:yum update -y 整一个gitlab镜像:docker pull gitlab/gitlab-ce 运行一个gitlab容器:docker run -d -p 8443:443 -p…

函数定义、合约与面向对象(以太坊solidity合约)

函数定义、合约与面向对象(以太坊solidity合约) 1-函数定义、构造与多态2-事件日志3-面向对象特征 1-函数定义、构造与多态 创建合约就是创建类,部署合约就是实例化 合约的方法还支持多态 还能使用第三方的库进行开发 整个合约部署后&…

【第4章】Spring Cloud之Nacos单机模式支持mysql

文章目录 前言一、初始化1. 初始化数据库2. 修改配置文件 二、效果1. 重新启动2. 新增用户 总结 前言 在0.7版本之前,在单机模式时nacos使用嵌入式数据库实现数据的存储,不方便观察数据存储的基本情况。0.7版本增加了支持mysql数据源能力,具…

【devops】gitlab 实现cicd 实践

本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》:python零基础入门学习 《python运维脚本》: python运维脚本实践 《shell》:shell学习 《terraform》持续更新中:terraform_Aws学习零基础入门到最佳实战 《k8…

HarmonyOS页面跳转和页面间传值

IndexPage 定义一个参数类 export class RouterParams {src:stringconstructor(str:string) {this.src str} }点击按钮后,将创建的RouterParams 对象传递到第二页 Button($r(app.string.next)).fontSize(16).width(300).height(50).backgroundColor($r(app.color.…

Android 视频音量图标

attrs.xml <?xml version"1.0" encoding"utf-8"?> <resources><!--图标颜色--><attr name"ijkSolid" format"color|reference" /><!--喇叭底座宽度--><attr name"ijkCornerWidth" form…

WINUI或WPF灵活使用样式、控件模板、自定义控件、用户控件

在WINUI与WPF 中&#xff0c;控件模板&#xff08;ControlTemplate&#xff09;、样式&#xff08;Style&#xff09;、自定义控件&#xff08;CustomControl&#xff09;和用户控件&#xff08;UserControl&#xff09;都是构建复杂和灵活用户界面的重要工具&#xff0c;但它们…

【electron6】浏览器实时播放PCM数据

pcm介绍&#xff1a;PCM&#xff08;Puls Code Modulation&#xff09;全称脉码调制录音&#xff0c;PCM录音就是将声音的模拟信号表示成0,1标识的数字信号&#xff0c;未经任何编码和压缩处理&#xff0c;所以可以认为PCM是未经压缩的音频原始格式。PCM格式文件中不包含头部信…

ForCloud全栈安全体验,一站式云安全托管试用 开启全能高效攻防

对于正处于业务快速发展阶段的企业&#xff0c;特别是大型央国企而言&#xff0c;日常的安全部署和运营管理往往横跨多家子公司&#xff0c;所面临的挑战不言而喻。尤其是在面对当前常态化的大型攻防演练任务时&#xff0c;难度更是呈“几何级数”上升&#xff1a; 合规难 众…

安卓 mvp 的架构的详细介绍

MVP 架构介绍 MVP&#xff08;Model-View-Presenter&#xff09;是一种软件架构模式&#xff0c;常用于构建用户界面&#xff08;UI&#xff09;。它将应用程序的逻辑划分为三个部分&#xff1a;Model、View 和 Presenter。MVP 的主要目标是分离视图和业务逻辑&#xff0c;使代…

使用github actions构建多平台electron应用

1. 创建electron项目 使用pnpm创建项目 pnpm create quick-start/electron 2. 修改electron-builder.yml文件 修改mac的target mac:target:- target: dmgarch: universal 3. 添加workflow 创建 .github/workflows/main.yml 文件 name: Build/release Electron appon:work…

二、原型模式

文章目录 原型模式1 基本介绍2 实现方式深浅拷贝目标2.1 使用 Object 的 clone() 方法2.1.1 代码2.1.2 特性2.1.3 实现深拷贝 2.2 在 clone() 方法中使用序列化2.2.1 代码 2.2.2 特性 3 实现的要点4 Spring 中的原型模式5 原型模式的类图及角色5.1 类图5.1.1 不限制语言5.1.2 在…

8、添加第三方包

目录 1、安装Django Debug Toolbar Django的一个优势就是有丰富的第三方包生态系统。这些由社区开发的包&#xff0c;可以用来快速扩展应用程序的功能集 1、安装Django Debug Toolbar Django Debug Toolbar位于名列前三的第三方包之一 这是一个用于调试Debug Web应用程序的有…

小程序-5(vant组件+全局数据共享+分包+tabBar案例)

目录 1.使用npm包 小程序对npm的支持和限制 使用vant组件 使用CSS变量定制主题样式 API的promise化 2.全局数据共享 小程序中的全局数据共享方案 安装MobX相关的包 创建MobX的store实例 将Store中的成员绑定到页面中 在页面上使用Store中的成员 将Store中的成员绑定…

Python——使用Seaborn钻石数据可视化分析(2)

续 Python——使用Seaborn钻石数据可视化分析(1) 目录 📈 4、非数值变量描述性统计分析 1️⃣ 柱状图——分析钻石切工的情况 📍 sns.countplot —— 绘制柱状图、条形图 2️⃣ 箱线图——分析不同切工的钻石的价格情况 📍 sns.barplot —— 不同分类变量之间的数…

【论文阅读】Mamba: Linear-Time Sequence Modeling with Selective State Spaces

Mamba: Linear-Time Sequence Modeling with Selective State Spaces 论文&#xff1a;[2312.00752] Mamba: Linear-Time Sequence Modeling with Selective State Spaces 作者&#xff1a;Albert Gu 和 Tri Dao&#xff0c;分别来自卡内基梅隆大学机器学习系和普林斯顿大学计…

HarmonyOS ArkUi 唤起系统APP:指定设置界面、浏览器、相机、拨号界面、选择通讯录联系人

效果&#xff1a; 完整工具类&#xff1a; import { common, Want } from kit.AbilityKit; import { BusinessError } from kit.BasicServicesKit; import { call } from kit.TelephonyKit; import { promptAction } from kit.ArkUI; import { contact } from kit.Contacts…

docker 部署wechatbot-webhook 并获取接口实现微信群图片自动保存到chevereto图库等

功能如图&#xff1a; docker部署 version: "3" services:excalidraw:image: dannicool/docker-wechatbot-webhook:latestcontainer_name: wechatbot-webhookdeploy:resources:limits:cpus: 0.15memory: 500Mreservations:cpus: 0.05memory: 80Mrestart: alwayspor…

RabbitMQ学习实践二:MQ的实现

文章是本人在学习springboot实现消息队列功能时所经历的过程的记录&#xff0c;仅供参考&#xff0c;如有侵权请随时指出。 参考文章地址&#xff1a; RabbitMQ安装与入门_rabbitmq win11配置-CSDN博客 RabbitMQ入门到实战一篇文章就够了-CSDN博客 RabbitMQ系列&#xff08…

走进数组的奇妙之旅

引言&#xff1a; 在前几篇文章中&#xff0c;我们深入探讨了函数的奥秘。在讲述函数知识的过程中&#xff0c;我们邂逅了一个新的概念&#xff0c;你或许还记得在演示 strcpy函数时&#xff0c;出现的这行代码&#xff1a;char1[20]{0};。当时&#xff0c;你是否感到好奇&…