【Python】爬虫实战01:获取豆瓣Top250电影信息

本文中我们将通过一个小练习的方式利用urllibbs4来实操获取豆瓣 Top250 的电影信息,但在实际动手之前,我们需要先了解一些关于Http 请求和响应以及请求头作用的一些知识。

1. Http 请求与响应

HTTP(超文本传输协议)是互联网上应用最为广泛的协议之一,它定义了客户端(通常是浏览器)和服务器之间交换数据的格式和规则。以下是HTTP请求与响应结合实际情况的介绍:

1.1 Http 请求(Request)

1.1.1 请求的组成

一个HTTP请求通常包含以下几个部分:

  • 请求行:包括请求方法、URL和HTTP版本。
  • 请求头:包含关于客户端环境和请求本身的信息,如用户代理(User-Agent)、接受的内容类型(Accept)等。
  • 空行:用于分隔请求头和请求体。
  • 请求体(可选):包含要发送给服务器的数据,如表单数据或JSON数据。
1.1.2 请求方法
  • GET:请求获取服务器上的资源。
  • POST:向服务器提交数据,通常用于提交表单或上传文件。
  • PUT:更新服务器上的资源。
  • DELETE:请求删除服务器上的资源。
1.1.3 实际应用

例如,当用户在浏览器中输入一个网址并按下回车时,浏览器会构造一个GET请求发送给服务器,请求头可能包含如下信息:

GET /index.html HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8

这个请求意味着客户端请求获取服务器上名为www.example.com的网站根目录下的index.html文件。

1.2 Http 响应(Response)

1.2.1 响应的组成

一个HTTP响应通常包含以下几个部分:

  • 状态行:包括HTTP版本、状态码和状态消息。
  • 响应头:包含服务器信息和资源信息,如内容类型(Content-Type)、内容长度(Content-Length)等。
  • 空行:用于分隔响应头和响应体。
  • 响应体:包含从服务器返回的资源内容。
1.2.2 状态码
  • 1xx:信息性状态码,如100 Continue。
  • 2xx:成功状态码,如200 OK。
  • 3xx:重定向状态码,如302 Found。
  • 4xx:客户端错误状态码,如404 Not Found。
  • 5xx:服务器错误状态码,如500 Internal Server Error。
1.2.3 实际应用

例如,当服务器收到上述GET请求后,可能会返回以下响应:

HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
Content-Length: 1250
<!DOCTYPE html>
<html>
<head><title>Example Page</title>
</head>
<body><h1>Welcome to Example.com</h1><p>This is an example HTML page.</p>
</body>
</html>

这个响应意味着服务器成功找到了请求的资源,并在响应体中返回了该HTML页面的内容。

HTTP请求与响应是客户端和服务器间通信的基础,它们通过请求方法、状态码、头部字段等机制确保了信息的有效传递。在实际应用中,无论是网页浏览、API调用还是文件上传,都离不开HTTP协议的这些基本原理。

2. GET、POST与请求头

下面是使用Pythonrequests库发送GET请求和POST请求的简单示例。首先,确保你已经安装了requests库。如果没有安装,可以通过以下命令安装:

pip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple

2.1 GET请求示例

2.1.1 不带请求头的 GET 请求
import requests
# 发送不带请求头的GET请求
response = requests.get('http://httpbin.org/get')
print(response.text)
2.1.2 带请求头的 GET 请求
import requests
# 定义请求头
headers = {'User-Agent': 'My Custom User Agent','Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'
}
# 发送带请求头的GET请求
response = requests.get('http://httpbin.org/get', headers=headers)
print(response.text)

2.2 POST请求示例

2.2.1 不带请求头的 POST 请求
import requests
# 发送不带请求头的POST请求
response = requests.post('http://httpbin.org/post', data={'key': 'value'})
print(response.text)
2.2.2 带请求头的 POST 请求
import requests
# 定义请求头
headers = {'User-Agent': 'My Custom User Agent','Content-Type': 'application/x-www-form-urlencoded'
}
# 发送带请求头的POST请求
response = requests.post('http://httpbin.org/post', headers=headers, data={'key': 'value'})
print(response.text)

2.3 带请求头与不带请求头的区别

  1. 身份识别:请求头中的User-Agent字段可以帮助服务器识别发起请求的客户端类型(如浏览器、爬虫或其他应用程序)。如果不带请求头,服务器可能无法正确处理请求,或者将请求视为不合法的访问。
  2. 内容协商:请求头中的Accept字段告诉服务器客户端可以接收的内容类型。如果服务器支持多种内容类型,它将根据这个字段选择最合适的内容类型来响应。
  3. 数据格式:对于POST请求,请求头中的Content-Type字段指定了发送到服务器的数据格式。例如,如果发送的是JSON数据,通常需要将Content-Type设置为application/json
  4. 安全性:一些API可能要求特定的请求头来进行认证或授权。如果不带这些请求头,API可能拒绝服务。(如豆瓣)
  5. 自定义行为:开发者可能需要发送自定义的请求头以触发服务器端特定的行为,如缓存策略、压缩格式等。
    不带请求头的请求在某些简单情况下可能仍然有效,但为了更好地控制请求行为和确保与服务器正确交互,通常建议在请求中包含适当的请求头。

3. 分析网页结构

在这里插入图片描述

  • 进入豆瓣排行榜网页后,我们右击 --> 检查 --> 元素 一栏中可以找到我们想要的信息

在这里插入图片描述

  • 在这里我们可以看到,我们需要的数据都是静态数据,直接嵌入在网页源代码里,我们只需对照相应的属性名进行获取即可,在找到我们想要的数据后,就可以着手写代码了。

4. 代码实现

话不多说,我们直接上代码

import random
import urllib.request
from bs4 import BeautifulSoup
import codecs
from time import sleep"""
#	爬取豆瓣 TOP250 电影名称、链接、评分及影评
"""def GetContent(url, headers):# 发送请求page = urllib.request.Request(url, headers=headers)page = urllib.request.urlopen(page)contents = page.read()# 用BeautifulSoup解析网页soup = BeautifulSoup(contents, "html.parser")infofile.write("")print('爬取豆瓣电影250: \n')for tag in soup.find_all(attrs={"class": "item"}):# 爬取序号num = tag.find('em').get_text()print(num)infofile.write(num + "\r\n")# 电影名称name = tag.find_all(attrs={"class": "title"})zwname = name[0].get_text()print('[中文名称]', zwname)infofile.write("[中文名称]" + zwname + "\r\n")# 网页链接url_movie = tag.find(attrs={"class": "hd"}).aurls = url_movie.attrs['href']print('[网页链接]', urls)infofile.write("[网页链接]" + urls + "\r\n")# 爬取评分和评论数info = tag.find(attrs={"class": "star"}).get_text()info = info.replace('\n', ' ')info = info.lstrip()print('[评分评论]', info)# 获取评语info = tag.find(attrs={"class": "inq"})if (info):  # 避免没有影评调用get_text()报错content = info.get_text()print('[影评]', content)infofile.write(u"[影评]" + content + "\r\n")print('')if __name__ == '__main__':# 存储文件infofile = codecs.open("../Top250_Movies.txt", 'a', 'utf-8')# 消息头headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'}# 翻页i = 0while i < 10:print('页码', (i + 1))num = i * 25  # 每次显示25部 URL序号按25增加url = 'https://movie.douban.com/top250?start=' + str(num) + '&filter='GetContent(url, headers)sleep(5 + random.random())infofile.write("\r\n\r\n")i = i + 1infofile.close()

爬取结果如下,爬取完的数据存放在Top250_Movies.txt文件中
在这里插入图片描述

如果需要获取其他的数据,可自行扩展

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

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

相关文章

微软Win11 24H2七月更新补丁KB5040435发布!附下载

系统之家于7月10日发出最新报道&#xff0c;微软为Win11用户发布了24H2版本七月的最新更新补丁KB5040435。用户升级系统后&#xff0c;会发现版本号升至 26100.1150。此次更新针对远程身份验证拨入用户服务(RADIUS)协议与 MD5冲突等问题进行修复。接下来跟随小编看看此次更新的…

LabVIEW中modbusTCP怎样才能和profibusDP通信?

在LabVIEW中&#xff0c;Modbus TCP和Profibus DP是两种不同的工业通信协议&#xff0c;要实现这两者之间的通信&#xff0c;可以采用网关设备进行协议转换&#xff0c;或者通过一个中间设备&#xff08;如PLC&#xff09;进行数据桥接。以下是实现此通信的一些方法&#xff1a…

设计模式探索:适配器模式

1. 适配器模式介绍 1.1 适配器模式介绍 适配器模式&#xff08;adapter pattern&#xff09;的原始定义是&#xff1a;将一个类的接口转换为客户期望的另一个接口&#xff0c;适配器可以让不兼容的两个类一起协同工作。 适配器模式的主要作用是把原本不兼容的接口&#xff0c…

提高使用安全,智慧校园在线用户功能概述

智慧校园系统融入了一个查看当前在线用户的功能&#xff0c;这一设计旨在为管理人员提供一个实时的窗口&#xff0c;洞悉校园平台的即时活跃情况&#xff0c;确保系统的高效运作与环境安全。通过这一功能&#xff0c;管理员能够一目了然地看到所有正活跃在平台上的用户群体&…

server nat表和会话表的作用及NAT地址转换详细

本章节主要讲nat技术的基础 -会话表的建立也是看5元组 -状态检测技术的回包一样也看5元组&#xff0c;但是状态检测技术会看的除开5元组还有更多东西 老哥&#xff0c;你真的应该好好注意一个东西&#xff1a;我们的会话表只是为了后续包的转发&#xff0c;会话表是记录的首…

视频播放器的问题

<template><div class"app-container"><el-form :model"queryParam" ref"queryForm" :inline"true"><el-form-item label"题目ID&#xff1a;"><el-input v-model"queryParam.id" cle…

WEB07Vue+Ajax

1. Vue概述 Vue&#xff08;读音 /vjuː/, 类似于 view&#xff09;&#xff0c;是一款用于构建用户界面的渐进式的JavaScript框架&#xff08;官方网站&#xff1a;https://cn.vuejs.org&#xff09;。 在上面的这句话中呢&#xff0c;出现了三个词&#xff0c;分别是&#x…

在Linux系统实现瑞芯微RK3588部署rknntoolkit2进行模型转换

一、首先要先安装一个虚拟的环境 安装Miniconda包 Miniconda的官网链接:Minidonda官网 下载好放在要操作的linux系统,我用的是远程服务器的linux系统,我放在whl这个文件夹里面,这个文件夹是我自己创建的 运行安装 安装的操作都是yes就可以了 检查是否安装成功,输入下面…

Qt开发 | Qt绘图技术 | 常见图像绘制 | Qt移动鼠标绘制任意形状 | Qt绘制带三角形箭头的窗口

文章目录 一、基本绘图技术介绍二、常见的18种图形、路径、文字、图片绘制三、Qt移动鼠标绘制任意形状四、Qt绘制带三角形箭头的窗口 一、基本绘图技术介绍 Qt提供了绘图技术&#xff0c;程序员可以在界面上拖动鼠标&#xff0c;或者在代码里指定参数进行绘图。 Qt绘图技术介绍…

系统架构师考点--软件工程(上)

大家好。今天我来总结一下软件工程的相关考点。这部分是考试的重点。在上午场客观题、下午场案例题以及下午场论文都有可能考到&#xff0c;在上午场客观题中大约占12-15分左右。 一、软件工程概述 软件开发生命周期 软件定义时期&#xff1a;包括可行性研究和详细需求分析过…

单元测试实施最佳方案(背景、实施、覆盖率统计)

1. 什么是单元测试&#xff1f; 对于很多开发人员来说&#xff0c;单元测试一定不陌生 单元测试是白盒测试的一种形式&#xff0c;它的目标是测试软件的最小单元——函数、方法或类。单元测试的主要目的是验证代码的正确性&#xff0c;以确保每个单元按照预期执行。单元测试通…

构建高精度室内定位导航系统,从3DGIS到AI路径规划的全面解析

室内定位导航系统是一种利用多种技术实现室内精准定位和导航的智能系统&#xff0c;即便没有卫星信号&#xff0c;也能实现精准导航。维小帮室内定位导航系统是基于自研的地图引擎与先进定位技术&#xff0c;结合智能路径规划算法&#xff0c;解决了人们在大型复杂室内场所最后…

【Linux】多线程_3

文章目录 九、多线程3. C11中的多线程4. 线程的简单封装 未完待续 九、多线程 3. C11中的多线程 Linux中是根据多线程库来实现多线程的&#xff0c;C11也有自己的多线程&#xff0c;那它的多线程又是怎样的&#xff1f;我们来使用一些C11的多线程。 Makefile&#xff1a; te…

Unity基础调色

叭叭叭 最近&#xff08;*这两天&#xff09;因为想做一些Unity的调色问题&#xff0c;尝试原文翻译一下&#xff0c;其实直接原文更好&#xff01;&#xff01; Color Grading 参考了&#xff0c;某大牛的翻译&#xff0c;实在忍不住了&#xff0c;我是不知道为什么能翻译成…

Vivado 2020.1 HLS IP在BD模式无法生成问题

折腾了一周整整&#xff0c;记录一下&#xff0c;希望对大家有用。 各种找、各种操作&#xff0c;也问了FAE&#xff0c;都没搞定。 最后看到如下博文的方法3&#xff0c;管用。 vivado综合hls类ip核报错问题解决方案_vivado ip synth checkpoint mode-CSDN博客 报错描述 m…

论文翻译:Large Language Models for Education: A Survey and Outlook

https://arxiv.org/abs/2403.18105 目录 教育领域的大型语言模型&#xff1a;一项调查和展望摘要1. 引言2. 教育应用中的LLM2.1 概述2.2 学习辅助2.2.1 问题解决&#xff08;QS&#xff09; 2.2.2 错误纠正&#xff08;EC&#xff09;2.2.3 困惑助手&#xff08;CH&#xff09;…

Jenkins中Node节点与构建任务

目录 节点在 Jenkins 中的主要作用 1. 分布式构建 分布式处理 负载均衡 2. 提供不同的运行环境 多平台支持 特殊环境需求 3. 提高资源利用率 动态资源管理 云端集成 4. 提供隔离和安全性 任务隔离 权限控制 5. 提高可扩展性 横向扩展 高可用性 Jenkins 主服务…

【香菇带你学Linux】Linux环境下gcc编译安装【建议收藏】

文章目录 0. 前言1. 安装前准备工作1.1 创建weihu用户1.2 安装依赖包1.2.1 安装 GMP1.2.2 安装MPFR1.2.3 安装MPC 2. gcc10.0.1版本安装3. 报错解决3. 1. wget下载报错 4. 参考文档 0. 前言 gcc&#xff08;GNU Compiler Collection&#xff09;是GNU项目的一部分&#xff0c;…

excel 百分位函数 学习

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、函数说明PERCENTILE 函数PERCENTILE.inc 函数PERCENTILE.exc 函数QUARTILE.EXC 函数 二、使用步骤总结 前言 excel 百分位函数 Excel提供了几个函数用于…

ctfshow-web入门-php特性(web100-web103)is_numeric 函数绕过

目录 1、web100 2、web101 3、web102 4、web103 1、web100 提示&#xff1a;flag in class ctfshow&#xff0c;我们只需要构造输出 ctfshow 这个类即可。 代码分析&#xff1a; $v0is_numeric($v1) and is_numeric($v2) and is_numeric($v3); if($v0){ 虽然逻辑运算符的…