【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"}).a

        urls = 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 = 0

    while 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 + 1

    infofile.close()

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Unity中一键生成具有身体感知的虚拟人物动作

在虚拟现实(VR)和增强现实(AR)的浪潮中&#xff0c;如何让虚拟人物的动作更加自然、真实&#xff0c;已经成为一个重要课题。AI4Animation项目&#xff0c;一个由 Sebastian Starke 主导的开源框架&#xff0c;为Unity开发者提供了强大的工具集&#xff0c;以实现这一目标。本文…

threadx netxduo stm32f407上实现http server

这次用的是CubeIDE + CubeMX 要把NX_APP的mem分配的大一些,在app_azure_rtos.c中,我给的是40*1024,如果给的不够,会导致后面无法分配pool和thread等等 需要用到filex 要在CubeMX里面勾选上,还要用到http_server和dhcp netxduo/addons/auto_ip at v6.1.11_rel eclipse-th…

AI时代:探索个人潜能的新视角

文章目录 Al时代的个人发展1 AI的高速发展意味着什么1.1 生产力大幅提升1.2 生产关系的改变1.3 产品范式1.4 产业革命1.5 Al的局限性1.5.1局限一:大模型的幻觉 1.5.2 局限二&#xff1a;Token 2 个体如何应对这种改变?2.1 职场人2.2 K12家长2.3 大学生2.4 创业者 3 人工智能发…

怎么安装Manim库在Windows环境下的Jupyter Notebook上

Manim 是解释性数学视频的动画引擎。 您可以使用它来制作数学视频&#xff08;或其他字段&#xff09;。也许你们会在有有些平台上会看过特别好看的数学动画&#xff0c;例如 3Blue1Brown等。这些动画特别好看&#xff0c;还特别丝滑&#xff0c;基本找不到太大的毛病。 我当初…

初步探究Rust生态与图形界面编程

引言 Rust作为一种现代的、安全的系统编程语言&#xff0c;自2010年问世以来&#xff0c;逐渐在开发社区中崭露头角。它的内存安全保证、并发处理能力、以及无需垃圾回收机制的高性能特性&#xff0c;使得它成为了开发系统工具、网络服务、以及嵌入式系统的热门选择。然而&…

20240715 每日AI必读资讯

&#x1f310; 代号“ 草莓 ”&#xff0c;OpenAI 被曝研发新项目&#xff1a;将 AI 推理能力提至新高度 - OpenAI 公司被曝正在研发代号为“ 草莓 ”的全新项目&#xff0c;进一步延伸去年 11 月宣布的 Q* 项目&#xff0c;不断提高 AI 推理能力&#xff0c;让其更接近人类的…

32路串口服务器 应用领域

32路串口服务器在多个领域有着广泛的应用&#xff0c;以下是详细的应用实例&#xff1a; 一、工业自动化 在工业自动化领域&#xff0c;32路串口服务器发挥着举足轻重的作用。传统的工业设备往往采用串口通信方式&#xff0c;而串口服务器能够将这些设备接入网络&#xff0c;…

Nodejs 第八十章(Kafka高级)

kafka前置知识在前几章章讲过了 不再复述 Kafka集群操作 1.创建多个kafka服务 拷贝一份kafka完整目录改名为kafka2 修改配置文件 kafka2/config/server.properties 这个文件 broker.id1 //唯一broker port9093 //切换端口 listenersPLAINTEXT://:9093 //切换监听源启动zooKe…

多表联合的查询(实例)、对于前端返回数据有很多表,可以分开操作、debug调试教程

2024.7.13 一、 对于多表的更深层的认识1. 认识2. 多表联合查询的列子&#xff1a;3. 对于多表查询的进一步认识4. 在实现功能的时候&#xff0c;原本对于省市县这样的表&#xff0c;对于项目的要求&#xff0c;是直接全部查询出来&#xff0c;然后开始使用&#xff0c;但我想着…

Elasticsearch:使用 Amazon Bedrock 的 semantic_text

作者&#xff1a;来自 Elastic Gustavo Llermaly 使用 semantic_text 新功能&#xff0c;并使用 AWS Bedrock 作为推理端点服务。 Elasticsearch 的新 semantic_text 映射类型旨在简化构建 RAG 应用程序的常见挑战。它整合了文本分块、生成嵌入以及检索嵌入的步骤。 在本文中…

C++进阶(while循环——函数应用)

知识点代码框架总结 输入n组数据 &#xff0c;对n组数据里面的每一组进行处理&#xff08;输出、求和 、运算、其他&#xff09; int n;//几组数据cin >> n;//2while(n--){//对每组数据进行处理}看到下面的样例&#xff0c;肌肉型反映出上面的框架//2// 1 2 3// 4 5 6若…

机器学习筑基篇,Jupyter Notebook 精简指南

[ 知识是人生的灯塔&#xff0c;只有不断学习&#xff0c;才能照亮前行的道路 ] 0x00 Jupyter Notebook 简明指南 描述&#xff1a;前面我们已经在机器学习工作站&#xff08;Ubuntu 24.04 Desktop Geforce RTX 4070Ti SUPER&#xff09;中安装 Anaconda 工具包&#xff0c;其…

Oracle23ai 新特性IF [NOT] EXISTS 语法支持

Oracle23ai 新特性IF [NOT] EXISTS Syntax Support 官方文档地址 https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/release-changes.html#GUID-9EE96980-43F9-4068-893E-C191CD83ACA6 IF [NOT] EXISTS 语法支持 CREATE、ALTER和DROP DDL语句支持IF NO…

python:绘制一元三次函数的曲线

编写 test_x3_3x.py 如下 # -*- coding: utf-8 -*- """ 绘制函数 y x^33x4 在 -3<x<3 的曲线 """ import numpy as np from matplotlib import pyplot as plt# 用于正常显示中文标题&#xff0c;负号 plt.rcParams[font.sans-serif] […

【人工智能】线性回归

目录 一、使用正规化方法计算下列样本的预测函数 1. 没有归一化之前 2. 归一化之后 二、读取ex1data2.txt中的数据&#xff0c;建立样本集&#xff0c;使用正规化法获取&#xff08;房屋面积&#xff0c;房间数量&#xff09;与房屋价格间的预测函数 1. 读取数据&#xff…

pico+unity3d项目配置

重点&#xff1a;unity编辑器版本要和pico的sdk要求一致、比如&#xff1a; 对于 Unity 2022.1.14 及以上版本&#xff0c;若同时在项目中使用 URP、Linear 色彩空间、四倍抗锯齿和OpenGL&#xff0c;会出现崩溃。该问题待 Unity 引擎解决。对于 Unity 2022&#xff0c;若同时…

Ubuntu20.04 编译安装FFmpeg,出错分析以及解决方案

最近工程上需要对FFmpeg底层源码进行修改&#xff0c;需要重新编译&#xff0c;遇见不少坑&#xff0c;出篇教程记录一下。 文章目录 1.FFmpeg源码下载地址2.编译环境配置3.编译FFmpeg4.配置FFmpeg运行环境 1.FFmpeg源码下载地址 官方下载地址:Index of /releases (ffmpeg.or…

寄存器分配

概述 寄存器位于CPU 或 GPU内部的少量高速存储器&#xff0c;通常用于保存机器指令的操作数 由于其价格昂贵&#xff0c;导致其数量有限&#xff0c;又由于存储速度快&#xff0c;使其不可或缺。因此&#xff0c;寄存器是计算机体系结构中的关键资源之一。在计算复杂表达式的…

Python爬虫速成之路(2):爬天气情况

hello hello~ &#xff0c;这里是绝命Coding——老白~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f4a5;个人主页&#xff1a;绝命Coding-CSDN博客 &a…

常见问题记录(持续更新)

备注&#xff1a; 在7月10日记录之前遇到的问题及解决方法: 一&#xff1a;常见的访问问题&#xff1a; 403 Forbidden&#xff1a;&#xff08;未有请求权限&#xff09; 表示服务器理解请求但是拒绝执行它。这通常是由于服务器上的文件或资源没有正确的读、写或执行权限&…