爬虫实例分析

2023-11-02

下面我将介绍如何一步一步将豆瓣的top250的网页数据爬取并保存在本地。

首先我们需要python的基础:定义变量,列表,字典,元组,if语句,while语句等。

然后利用了解爬虫的基本框架(原理):爬虫就是模仿浏览器去访问网络中的网页,并将网页爬到电脑的内存中并进行解析,最终将我们想要的数据进行存储。在此条件下,我们需要给于爬虫(灵魂)逻辑,也就要求我们对爬取对象的个体和总体进行比对,从而发现规律。也就是说,我们想让爬虫动起来,我们首先要自己能看懂网页。(提前学一下html,会轻松一些)

然后呢,我们就要利用python强大的第三方库,在这个实例中我用到了这么几个库:

import urllib.request,urllib.error
import re
from bs4 import BeautifulSoup
import xlwt

其对应的用法我就不多说了。

对于整个框架无疑就是函数的运行,在主函数内套娃:

#-*- codeing = utf-8 -*-
def main():
    print('''
        1.网页爬取函数
        2.解析数据函数
        3.保存数据函数
    '''
    )
if __name__ == __mian__:
    main()

我先把主函数放这里,最后看哟

def main():
    baseurl="https://movie.douban.com/top250?start="
    savepath="豆瓣电影Top250.xls"
    datalist=getData(baseurl)
    saveData(datalist,savepath)

1.首先我们要爬取网页

def askURL(url):
    head={
        "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36"
    }
    request=urllib.request.Request(url,headers=head)
    html = ""
    try:
        response=urllib.request.urlopen(request)
        html = response.read().decode("utf-8")
    except urllib.error.URLError as e:
        if hasattr(e,"code"):
            print(e.code)
        if hasattr(e,"reason"):
            print(e.reason)
    return html

这大致就是浏览器向人家服务器要网页的过程,首先是请求头,一般像这种无需登录的网站,把我们谷歌的’User-Agent'放里头就行,如果是需要登录的网站,几乎需要全套了。剩下的就交给urllib了,由于对象服务的状态是未知的,我们需要对我们爬取过程中的状态有一个了解,即错误捕获。我们给爬虫这么多活,不能因为一个任务不能完成就罢工吧,try一try就可以了,这里是利用了urllib的urllib.error来识别网络报错。最后将获取的网页赋给html就可以走人了。

2.边爬取边解析网页

def getData(baseurl):
    datalist=[]
    for i in range(0,10):
        url = baseurl + str(i*25)
        html = askURL(url)    #保存获取的网页源码
        soup = BeautifulSoup(html,"html.parser")
        for item in soup.find_all('div',class_="item"):
            #print(item)
            data=[]
            item = str(item)    #转化为字符串
            link =re.findall(findlink,item)[0]
            data.append(link)
            imgSrc =re.findall(findImgSrc,item)[0]
            data.append(imgSrc)
            datalist.append(data)
            title=re.findall(findTitle,item)
            data.append(title)
    return datalist

我们不可能只爬取一个url,要根据我网页的特性,为爬虫设计爬取路线,每爬取一页就要解析一页,根据观察发现每页有25个电影,一共有250个电影共需要10页,url中的最后几个数字刚好与每页第一个电影的序号有关联,利用for循环遍历一遍就可以了。每循环一边就调用一遍askurl,并用”靓汤“对其进行解析,我们首先要筛选出有关的网页源码对其进行分析,发现每部电影的前面都带有'div',那就把所有div及其子页留下称为item,利用预先用正则表达式制定的规则对留下的东西的数据继续提取,提取出我们想要的数据。下面是放在全局变量中的正则表达式:

findlink = re.compile(r'<a href="(.*?)">',re.S)#让换行符包含在字符串中
findTitle =re.compile(r'<span class="title">(.*)</span>')
findImgSrc =re.compile(r'<img.*src="(.*?)"',re.S)

3.保存数据

def saveData(datalist,savepath):
    book =xlwt.Workbook(encoding="utf-8")
    sheet = book.add_sheet('豆瓣Top250')
    col=("电影详情链接","图片","片名")
    for i in range(0,3):
        sheet.write(0,i,col[i])
    for i in range(0,250):
        print("第%d条"%(i+1))
        data=datalist[i]
        for j in range(0,3):
            sheet.write(i+1,j,data[j])

    book.save('student.xls')

这里呢是将数据保存在了excel中,毕竟只有250行,如果有几万行的话就必须要用数据库了。存完的效果是这样的:

接下来我将会对数据进行可视化,欲知如何,还听下回分解。

本文只是对思路进行了梳理,具体的学术性问题没有遍及,还请谅解。 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

爬虫实例分析 的相关文章

  • 在二维数组中进行所有可能的组合

    我正在尝试制作具有所有可能组合的 4x4 16 像素黑白图像数组 我制作了以下数组作为模板 template 0 0 0 0 start with all white pixels 0 0 0 0 0 0 0 0 0 0 0 0 然后我想迭
  • 有什么好的适用于 Google App Engine 应用程序的 AJAX 框架吗? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在尝试在我的 Google App Engine 应用程序中实现 AJAX 因此我正在寻找一个好的
  • 我可以在 matplotlib 中的绘图左侧放置一个垂直颜色条吗?

    来自颜色条方法的 matplotlib 命令摘要 http matplotlib org api pyplot api html highlight colorbar matplotlib pyplot colorbar我知道关键字参数or
  • 在Python中将大文件(25k条目)加载到dict中很慢?

    我有一个大约有 25000 行的文件 它是 s19 格式的文件 每行就像 S214780010 00802000000010000000000A508CC78C 像这样的事情怎么样 我做了一个测试文件 只有一行S21478001000802
  • 获取字符串模板中所有标识符列表的函数(Python)

    对于标准库string template在Python中 有没有一个函数可以获取所有标识符的列表 例如 使用以下 xml 文件
  • 将列表值转换为 pandas 中的行

    我有数据帧 其中一列具有相同长度的 numpy ndarray 值 df list 0 Out 92 array 0 0 0 0 29273096 0 30691767 0 27531403 我想将这些列表值转换为数据框并从 df iloc
  • Asyncio:从未检索到任务异常的怪异

    假设我有一个简单的代码 import asyncio async def exc print 1 0 loop asyncio get event loop loop create task exc try loop run forever
  • Python 中“is”运算符的语义是什么?

    如何is运算符确定两个对象是否相同 它是如何工作的 我找不到它的记录 来自文档 http docs python org reference datamodel html 每个对象都有一个身份 一个类型 和一个值 对象的身份 一旦发生就永远
  • 如何在Python中手动对数字列表进行排序?

    规格 Ubuntu 13 04 Python 3 3 1 背景 Python的初学者 遇到了这个 手动排序 问题 我被要求做的事情 让用户输入 3 个数值并将它们存储在 3 个不同的变量中 不使用列表或排序算法 手动将这 3 个数字从小到大
  • 使用 python 从 CSV 创建字典

    我有一个 CSV 格式的文件 其中 A B 和 C 是标题 我如何以Python方式将此CSV转换为以下形式的字典 A 1 B 4 C 7 A 2 B 5 C 8 A 3 B 6 C 9 到目前为止我正在尝试以下代码 import csv
  • 提高光线追踪命中功能的性能

    我有一个简单的 python 光线追踪器 渲染 200x200 的图像需要 4 分钟 这对于我的口味来说绝对是太多了 我想改善这种情况 几点 我为每个像素发射多条光线 以提供抗锯齿功能 每个像素总共发射 16 条光线 200x200x16
  • Pandas 中每列的曲线拟合 + 外推值

    我有一个包含大约 300 列的数据集 每一列都与深度相关 Pandas DataFrame 的简化版本看起来像这样 import matplotlib pyplot as plt import numpy as np import pand
  • 为什么 pip 已经是最新的了却要求我升级?

    我全新安装了 python 3 7 1 64 位 并使用最新的 pyCharm 作为我的 IDE 我在这台机器上没有安装其他 python 我去安装 numpy 并收到以下消息 venv C Users John PycharmProjec
  • 机器学习的周期性数据(例如度角 -> 179 与 -179 相差 2)

    我使用 Python 进行核密度估计 并使用高斯混合模型对多维数据样本的可能性进行排名 每一条数据都是一个角度 我不确定如何处理机器学习的角度数据的周期性 首先 我通过添加 360 来删除所有负角 因此所有负角都变成了正角 179 变成了
  • Python GTK3 Treeview 向上或向下移动选择

    如何在树视图中向上或向下移动所选内容 我的想法是 我可以使用向上和向下按钮将选择向上移动一行或向下移动一行 我的 Treeview 使用 ListStore 不确定这是否重要 首先 我将使用我熟悉的 C 代码 如果您在将其翻译为 Pytho
  • 将 str.contains 映射到 pandas DataFrame

    python 初学者 我正在寻找创建字符串的字典映射以及关联的值 我有一个数据框 想要创建一个新列 如果字符串匹配 则会将该列标记为 x df pd DataFrame comp dell notebook dell notebook S3
  • 列表中的特定范围(python)

    我有一个从文本字符串中提取的整数列表 因此当我打印该列表 我称之为test I get 135 2256 1984 3985 1991 1023 1999 我想打印或制作一个仅包含特定范围内的数字的新列表 例如1000 2000之间 我尝试
  • Django 中使用外键的抽象基类继承

    我正在尝试在 Django 支持的网站上进行模型继承 以遵守 DRY 我的目标是使用一个名为 BasicCompany 的抽象基类来为三个子类提供通用信息 Butcher Baker CandlestickMaker 它们位于各自的应用程序
  • 为数据集生成随机 JSON 结构排列

    我想生成 JSON 结构的许多不同排列作为同一数据集的表示 最好不需要对实现进行硬编码 例如 给定以下 JSON name smith occupation agent enemy humanity nemesis neo 应该产生许多不同
  • 在自定义 keras 层的调用函数中传递附加参数

    我创建了一个自定义 keras 层 目的是在推理过程中手动更改前一层的激活 以下是基本层 它只是将激活值乘以一个数字 import numpy as np from keras import backend as K from keras

随机推荐

  • idea自定义 postfix completion提高编码效率

    postfix completion的使用 详情见 https www cnblogs com expiator p 17380495 html 自定义 postfix completion List String 初始化list key
  • 非关系型数据库Mongodb入门

    MongoDB是一个高性能 可扩展 易操作的非关系型数据库 适合处理大量数据和需要快速数据访问的应用程序 它使用文档数据模型 而不是传统的表结构 这使得它非常适合存储和查询复杂的数据结构 以下是MongoDB的一些主要特点和功能 文档数据模
  • Vivado中FFT核的使用解析及Matlab实现

    Vivado中FFT核的使用解析及Matlab实现 傅里叶变换 Fast Fourier Transform FFT 是一种重要的信号处理技术 广泛应用于音频 图像 通信等领域 在Vivado开发环境中 针对FFT操作提供了专门的IP核 可
  • js中对象值多个值快速置空

    1 批量处理制空的应用场景 比如我们关闭el dialog的弹框 再次打开编辑时 需要清空上次编辑时页面的值 这个时候我们需要在close方法内将弹框里面所渲染的值都值空 而一般对象的值一个个去置空在维护上不方便 所以采用这种统一的处理 后
  • 攻防世界 disabled_button

    查看页面源代码后发现 有个disabled class 标签 上网查看该标签的作用 发现只要把该标签删掉就能点击这个按钮了 使用bp抓包 如果直接forward则无法修改response回来的内容 因此在forward之前 需要点击acti
  • 数据迁移 java_数据迁移的成功策略

    迁移数据是一个具有挑战性的过程 将面临一些重大风险 因此必须尽可能有效地进行计划 执行 测试 数据迁移是将数据从源系统传输到目标系统的过程 这是任何数据存储专业人员的核心任务 数据迁移很重要 因为它是升级或整合服务器和存储硬件 或添加数据密
  • 如何快速入门 Python

    学习任何一门语言都是从入门 1 年左右 通过不间断练习达到熟练水准 3 到 5 年 少数人最终能精通语言 成为执牛耳者 他们是金字塔的最顶层 虽然万事开头难 但好的开始是成功的一半 今天这篇文章就来谈谈如何开始入门 Python 只要方向对
  • gerrit REST API

    查看REST API支持的所有命令 ssh p 29418 user gerrit host gerrit help gerrit COMMAND ARG help h end of options help h display this
  • Playwright直接控制本地Chrome浏览器的方法

    Playwright默认调用的是chromium浏览器 并且使用的是无痕模式 有时我们的一些cookie登录信息保存在我们日常使用的Chrome浏览器上 不想每次运行脚本都要去登录这么麻烦 那么playwright其实也可以直接调用我们平时
  • 【华为OD机试 2023】 匿名信(C++ Java JavaScript Python)

    华为od机试题库 华为OD机试2022 2023 C Java JS Py https blog csdn net banxia frontend category 12225173 html 华为OD机试2023最新题库 更新中 C Ja
  • std::stoi系列函数自动识别8进制、16进制数的方法

    像这样写只能转为0 string str 0x12 int i stoi str 正确的写法应该是这样 string str 0x12 int i stoi str 0 0 指定base是0 函数则自动判断 不写的话 默认值是10 当然不给
  • Java类和对象的练习题

    1 冒泡排序 package one 使用冒泡排序 实现如下的数组从小到大排序 int arr new int 34 5 22 98 6 76 0 3 public class pao public static void main Str
  • 【转】计算机网络——三次握手与四次挥手

    转载来源 网络编程知识预备 2 三次握手与四次挥手 流量控制 滑动窗口 拥塞控制 半连接状态 2MSL 目录 一 三次握手 什么是三次握手 三次握手图解 过程解析 1 第一次握手 2 第二次握手 3 第三次握手 二 四次挥手 什么是四次挥手
  • 关于电脑找不到vcruntime140_1.dll,无法继续执行代码的解决方案-这几种解决方法轻松解决

    vcruntime140 1 dll文件是Windows操作系统中必要的动态链接库文件之一 当出现错误提示 vcruntime140 1 dll文件未找到 或 vcruntime140 1 dll已丢失 时 就需要对该问题进行解决 以下是一
  • springboot读写json文件,格式化写入json,java

    java springboot读写json文件 这是一个很酷的动作 而且是格式化写入json 美观漂亮 有问题可以咨询我的微信yizheng369 源码地址 https gitee com 618859 java springboot up
  • 属性重要性的举例(定性数据聚类)

    近日在解决一组定性数据的聚类问题 看文献时觉得论文中 基于属性重要性的定性数据聚类方法 举例不太容易理解 尤其是对我这种不喜欢看数学公式的人 所以写了这篇以备忘 1 基础知识 粗糙集和等价关系可参考 https blog csdn net
  • JAVAのIO框架---commons-io

    commons io包下载地址 Commons IO Download Apache Commons IO 进入后点击第二个链接下载 解压完后 箭头所指就是我们这次要用的jar包了 复制它 进入idea 导入jar包最关键的一步来了 右键粘
  • 3.【多级缓存架构】数据库和缓存不一致的情况分析和解决方案

    3 多级缓存架构 数据库和缓存不一致的情况分析和解决方案 文章目录 3 多级缓存架构 数据库和缓存不一致的情况分析和解决方案 1 最初级的缓存不一致的问题以及解决方案 1 1 问题 先修改数据库 在删除缓存 如果删除缓存失败了 就会导致数据
  • 基于express的文件上传功能实现

    基于express 的文件上传功能 功能描述 可以上传文件 并在后台中看到上传的文件 可以上传图片 并进行一个简单预览 点击提交后可以在后台中看到 功能展示 功能实现 index html
  • 爬虫实例分析

    下面我将介绍如何一步一步将豆瓣的top250的网页数据爬取并保存在本地 首先我们需要python的基础 定义变量 列表 字典 元组 if语句 while语句等 然后利用了解爬虫的基本框架 原理 爬虫就是模仿浏览器去访问网络中的网页 并将网页