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

爬取网页源代码

        抓取百度首页的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,一经查实,立即删除!

相关文章

基于 Gunicorn、Flask 和 Docker 的 Web 应用开发

基于 Gunicorn、Flask 和 Docker 的 Web 应用开发教程 欢迎语 欢迎来到基于 Gunicorn、Flask 和 Docker 的 Web 应用开发教程,让我们开始构建你的微服务架构! 第一部分:Docker 和 Flask 简介 1.1 Docker 基本概念 Docker 是一个开源的应…

Go操作Redis详解

文章目录 Go操作Redis详解来源介绍Redis支持的数据结构Redis应用场景Redis与Memcached比较准备Redis环境go-redis库 安装连接普通连接连接Redis哨兵模式连接Redis集群基本使用set/get示例zset示例Pipeline事务WatchGo操作Redis详解 来源 https://www.liwenzhou.com/posts/Go/…

Linux中Vim常用指令的笔记

在Linux中,Vim是一个非常强大的文本编辑器,广泛应用于代码编写、文档编辑等多种场景。Vim提供了丰富的指令集,以下是一些常用的Vim指令笔记,涵盖了Vim的三种主要模式:命令模式(Normal模式)、编辑…

从零开始!Jupyter Notebook 安装教程

一、引言 Jupyter Notebook 是一款非常实用的交互式编程环境,广泛应用于数据分析、机器学习、教学等领域。在安装 Jupyter Notebook 之前,需要确保计算机已安装 Python ,下面将介绍 Python 和 Jupyter Notebook 的安装步骤。 二、Python 安…

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数据源能力,具…

极狐GitLab 如何管理 PostgreSQL 扩展?

GitLab 是一个全球知名的一体化 DevOps 平台,很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab :https://gitlab.cn/install?channelcontent&utm_sourcecsdn 是 GitLab 在中国的发行版,专门为中国程序员服务。可以一键式部署…

windows上安装Apache

安装前须知: 下载并安装,如未完成,请访问下载页面。安装Apache前需要安装Visual C Redistributable for Visual Studio 2015-2022 x64。 解压与配置: 将Apache24文件夹解压至C:\Apache24(这是配置中的ServerRoot&am…

【devops】gitlab 实现cicd 实践

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

C#虚方法和抽象方法

在 C# 中,虚方法(virtual method)和抽象方法(abstract method)都是用于支持面向对象编程中的多态性,但它们之间有一些关键的区别。 虚方法(Virtual Method) 定义:虚方法…

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…

实战:shell脚本练习

高效编写Bash脚本的技巧 总结了10个实用技巧&#xff0c;帮助提高脚本的效率和可靠性&#xff0c;具体包括&#xff1a; 多写注释&#xff1a;在脚本中添加注释&#xff0c;以帮助理解脚本的不同部分。 当运行失败时使脚本退出&#xff1a;使用set -o errexit或set -e&#x…

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 在…