Python爬虫入门实战(详细步骤)

news2024/9/26 18:34:03

1. 技术选型

爬虫这个功能,我个人理解是什么语言都能写的,只要能正常发送 HTTP 请求,将响应回来的静态页面模版 HTML 上把我们所需要的数据提取出来就可以了,原理很简单,这个东西当然可以手动去统计收集,但是网络平台毕竟还是很多的,还是画点时间,写个爬虫把数据爬取下来,存到数据库里,然后写一个统计报表的 SQL 语句比较方便,后续如果有时间的话,我会写一个简单的前后端分离的报表样例分享出来。

网上现在 Python 爬虫的课程非常的火爆,其实我心里也有点小九九,想玩点骚操作,不想用老本行去写这个爬虫,当然最后的事实是证明确实用 Python 写爬虫要比用 Java 来写爬虫要简单的多。

2. 环境准备

首先笔者的电脑是 Win10 的,Python 选用的是 3.7.4 ,貌似现在网上 Python3 的爬虫教程并不多,其中还是遇到不少的问题,下面也会分享给大家。

开发工具笔者选用的是 VSCode ,在这里推荐一下微软这个开源的产品,非常的轻量化,需要什么插件自己安装就好,不用的插件一律不要,自主性非常高,如果感觉搞不定的朋友可以选择 JetBrains 提供的 Pycharm ,分为社区版和付费版,一般而言,我们使用社区版足矣。

笔者这里直接新建了一个文件夹,创建了一个名为 spider-demo.py 的文件,这个就是我们一会要写的爬虫的文件了,可以给大家看下笔者的开发环境,如下:

这其实是一个调试成功的截图,从下面打印的日志中可以看到,笔者这里抓取了三个平台的数据。

3. 数据库

笔者使用的数据是 Mysql 5.7.19 版本,数据库的字符集是使用的 utf8mb4 ,至于为什么使用 utf8mb4 而不是 utf8 ,各位百度一下吧,很多人讲的都比我讲的好,我简单说一句就是 Mysql 的 utf8 其实是一个假的 utf8 ,而后面增加的字符集 utf8mb4 才是真正的 utf8 。

而 Python 连接 Mysql 也是需要驱动的,和在 Java 中连接数据库需要驱动一样,这里使用的是 pymysql ,安装命令:

pip install pymysql

有没有感觉很简单, pip 是 Python 的一个包管理工具,我的个人理解是类似于一个 Maven 的东西,所有的我们需要的第三方的包都能在这个上面下载到。

当然,这里可能会出现 timeout 的情况,视大家的网络情况而定,我在晚上执行这个命令的时候真的是各种 timeout ,当然 Maven 会有国内的镜像战, pip 显然肯定也会有么,这里都列给大家:

  • 阿里云 Simple Index
  • 中国科技大学 Simple Index
  • 豆瓣(douban) https://pypi.douban.com/simple/
  • 清华大学 Simple Index
  • 中国科学技术大学 Simple Index

具体使用方式命令如下:

pip install -i https://mirrors.aliyun.com/pypi/simple/ 库名

笔者这里仅仅尝试过阿里云和清华大学的镜像站,其余未做尝试,以上内容来自于网络。

表结构,设计如下图,这里设计很粗糙的,简简单单的只做了一张表,多余话我也不说,大家看图吧,字段后面都有注释了:

建表语句提交至 Github 仓库,有需要的同学可以去查看。

4. 实战

整体思路分以下这么几步:

  1. 通过 GET 请求将整个页面的 HTML 静态资源请求回来
  2. 通过一些匹配规则匹配到我们需要的数据
  3. 存入数据库

5.1 请求 HTML 静态资源

Python3 为我们提供了 urllib 这个标准库,无需我们额外的安装,使用的时候需要先引入:

from urllib import request

接下来我们使用 urllib 发送 GET 请求,如下:

req_csdn = request.Request('https://blog.csdn.net/meteor_93')
req_csdn.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36')
html_csdn = request.urlopen(req_csdn).read().decode('utf-8')

User Agent中文名为用户代理,简称 UA,它是一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等。

这里在请求头中添加这个是为了模拟浏览器正常请求,很多服务器都会做检测,发现不是正常浏览器的请求会直接拒绝,虽然后面实测笔者爬取的这几个平台都没有这项检测,但是能加就加一下么,当然真实的浏览器发送的请求头里面不仅仅只有一个 UA ,还会有一些其他的信息,如下图:

笔者这里的 UA 信息是直接从这里 Copy 出来的。代码写到这里,我们已经拿到了页面静态资源
html_csdn ,接下来我们就是要解析这个资源,从中匹配出来我们需要的信息。

5.2 xpath 数据匹配

xpath 是什么?

XPath 是一门在 XML 文档中查找信息的语言。XPath 可用来在 XML 文档中对元素和属性进行遍历。 XPath 是 W3C XSLT 标准的主要元素,并且 XQuery 和 XPointer 都构建于 XPath 表达之上。

从上面这句话我们可以看出来, xpath 是用来查找 XML ,而我们的 HTML 可以认为是语法不标准的 XML 文档,恰巧我们可以通过这种方式来解析 HTML 文档。

我们在使用 xpath 之前,需要先安装 xpath 的依赖库,这个库并不是 Python 提供的标准库,安装语句如下:

pip install lxml

如果网络不给力的同学可以使用上面的镜像站进行安装。

而 xpath 的表达式非常简单,具体的语法大家可以参考 W3school 提供的教程(XPath 语法 ),笔者这里不多介绍,具体使用方式如下:

read_num_csdn = etree.HTML(html_csdn).xpath('//*[@id="asideProfile"]/div[3]/dl[2]/dd/@title')[0]
fans_num_csdn = etree.HTML(html_csdn).xpath('//*[@id="fan"]/text()')[0]
rank_num_csdn = etree.HTML(html_csdn).xpath('//*[@id="asideProfile"]/div[3]/dl[4]/@title')[0]
like_num_csdn = etree.HTML(html_csdn).xpath('//*[@id="asideProfile"]/div[2]/dl[3]/dd/span/text()')[0]

这里笔者主要获取了总阅读数、总粉丝数、排名和总点赞数。

这里列举几个最基础的使用,这几个使用在本示例中已经完全够用:

表达式描述
nodename选取此节点的所有子节点。
/从根节点选取。
//从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。
.选取当前节点。
..选取当前节点的父节点。
@选取属性。
text选取当前节点内容。

还有一种简单的方式,我们可以通过 Chrome 浏览器获取 xpath 表达式,具体操作见截图:

打开 F12 ,鼠标右键需要生成 xpath 表达式的内容,点击 Copy -> Copy XPath 即可。

这里有一点需要注意,我们直接通过 xpath 取出来的数据数据类型并不是基础数据类型,如果要做运算或者字符串拼接,需要做类型强转,否则会报错,如下:

req_cnblog = request.Request('https://www.cnblogs.com/babycomeon/default.html?page=2')
req_cnblog.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36')
html_cnblog = request.urlopen(req_cnblog).read().decode('utf-8')

max_page_num = etree.HTML(html_cnblog).xpath('//*[@id="homepage_top_pager"]/div/text()')

# 最大页数
max_page_num = re.findall(r"\d+\.?\d*", str(max_page_num))[0]

这里需要获取 cnblog 的博客最大页数,首先取到了 max_page_num ,这里直接做 print 的话是可以正常打印一个字符串出来的,但是如果直接去做正则匹配,就会类型错误。

5.3 写入数据库

数据库的操作我就不多做介绍了,有写过 Java 的同学应该都很清楚 jdbc 是怎么写的,先使用 ip 、 port 、 用户名、密码、数据库名称、字符集等信息获取连接,然后开启连接,写一句 sql ,把 sql 拼好,执行 sql ,然后提交数据,然后关闭连接,代码如下:

def connect():
    conn = pymysql.connect(host='localhost',
                           port=3306,
                           user='root',
                           password='123456',
                           database='test',
                           charset='utf8mb4')

    # 获取操作游标
    cursor = conn.cursor()
    return {"conn": conn, "cursor": cursor}

connection = connect()
conn, cursor = connection['conn'], connection['cursor']

sql_insert = "insert into spider_data(id, plantform, read_num, fans_num, rank_num, like_num, create_date) values (UUID(), %(plantform)s, %(read_num)s, %(fans_num)s, %(rank_num)s, %(like_num)s, now())"

在本示例中,爬虫只负责一个数据爬取工作,所以只需要一句 insert 语句就够了,然后在每个平台爬取完成后,将这句 sql 中的占位符替换掉,执行 sql 后 commit 操作即可,示例代码如下:

csdn_data = {
    "plantform": 'csdn',
    "read_num": read_num_csdn,
    "fans_num": fans_num_csdn,
    "rank_num": rank_num_csdn,
    "like_num": like_num_csdn
}

cursor.execute(sql_insert, csdn_data)
conn.commit()

最后这里给大家免费分享一份Python学习资料,包含了视频、源码、课件,希望能够帮助到那些不满现状,想提示自己却又没用方向的朋友,也可以和我一起来交流呀!

编辑资料、学习路线图、源代码、软件安装包等!

一、Python所有方向的学习路线

Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

图片

图片

二、学习软件

工欲善其事必先利其器。学习Python常用的开发软件都在这里了,还有环境配置的教程,给大家节省了很多时间。

图片

三、全套PDF电子书

书籍的好处就在于权威和体系健全,刚开始学习的时候你可以只看视频或者听某个人讲课,但等你学完之后,你觉得你掌握了,这时候建议还是得去看一下书籍,看权威技术书籍也是每个程序员必经之路。

图片

四、入门学习视频全套

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。

图片

图片

 

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

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

相关文章

Spring的监听机制详解

Spring的监听机制详解 讲在前面 对Spring框架,大家都已不陌生,它给我们提供了很多功能,包括IoC、AOP、事务管理等。其中,Spring的事件监听机制是一项非常重要的功能,它允许开发人员定义和处理自定义事件,并…

深入研究scRNA-seq基础模型

基础模型在大量未标记的数据集上进行预训练,然后在特定任务上进行微调,最近基础模型在生物学应用中取得了成功。该文探讨了最近的scRNA-seq基础模型,scBERT和scGPT。专注于细胞类型注释的微调任务,主要探索了与简单基线&#xff0…

OpenCV教程04:结合pillow在图片上显示中文文字

1.如果添加的内容是纯英文文字,直接使用cv2.putText 函数操作即可。但它不支持自定义字体文件,仅限于这些内置的字体样式。如果你需要更复杂的字体支持,可能需要使用其他库,如 Python Imaging Library (PIL) 或 Pillow。可用的字体…

判断用户是否在pwa环境中打开运行?(已安装的 PWA 与未安装的 PWA 网站之间有什么区别?)以及pwa安装成功/失败的回调

前言: 👉vue3tsvite项目中使用vite-plugin-pwa搭建 PWA 项目,以及如何处理pwa安装图标的显示隐藏 👉pwa在iframe下能否显示,以及在iframe下相关问题解析 如何判断用户是否在pwa环境中运行? 根据pwa配置的display-mo…

下载qwen2-72b报错

下载大模型或者是国外的大文件,最好配置git的代理,报错如下:https://modelscope.cn/models/qwen/Qwen2-72B 增加以下配置解决 git config --global http.sslVerify “false” git config --global advice.detachedHead false

小程序测试文档

预约小程序测试文档 一、访客 1、访客审批预约在vue修改过成功以后&#xff0c;在小程序页面未显示 解决办法 在pages\appointQuery\appointQuery.wxml页面中修改 <view class"order_right"><view class"order_status_left" wx:if"{{item…

想发Top实力不够:顶刊也能“水”!影响因子9.1 ,国人友好,2个月秒速录用

本周投稿推荐 SCI&EI • 4区“水刊”&#xff0c;纯正刊&#xff08;来稿即录&#xff09; • CCF-B类&#xff0c;IEEE一区-Top&#xff08;3天初审&#xff09; EI • 各领域沾边均可&#xff08;2天录用&#xff09; 知网&#xff08;CNKI&#xff09;、谷歌学术 …

exptern “C“的作用,在 C 和 CPP 中分别调用 openblas 中的 gemm 为例

openblas提供的sgemm有两种方式&#xff0c;一种是通过cblas&#xff0c;另一种是直接声明并调用 sgemm_ 其中&#xff0c;cblas方式是更正规调用方法&#xff1b; 1&#xff0c;调用openblas的 sgemm 的两种方式 1.1 c语言程序中使用 sgemm hello_sgemm.c #include <st…

层次分析法(评价类问题)

本文章内容来自&#xff1a;​​​​​​​ 层次分析法模型讲解(附matlab和python代码) 【数学建模快速入门】数模加油站 江北_哔哩哔哩_bilibili 一. 概念 做决策依托于量化分析&#xff0c;量化分析依托于选择的指标以及各项指标的权重&#xff08;重要性及对结果的影响程度…

XLT开关矩阵

开关矩阵 苏州新利通 系列化开关矩阵是提高被测件测试效率、实现自动化测试的核心设备&#xff0c;是基于标准控制平台可进行定制化设计的产品。系列化开关矩阵工作频率范围覆盖DC~67GHz&#xff0c;可通过LAN、GPIB、RS232和USB-B等标准控制接口&#xff0c;支持客户端、Web…

ElasticSearch安装与集群部署

ElasticSearch安装与集群部署 很多小伙伴第一次接触ElasticSearch的时候是一脸愁容,这个东西他怎么用啊,不知道从哪里安装,那我们今天就着重从哪里下载?怎么下载?怎么安装?来研究一下吧! windows下载安装ElasticSearch 下载地址&#xff1a;https://www.elastic.co/cn/do…

移动端下拉加载更多(h5,小程序)

1.h5,使用原生方式监听页面滚动下拉加载更多 <template><div></div> </template><script> export default {data() {return {loadflag: true,maxpages: 0, //最大页码currentpage: 0, //当前页listData: [],config: {page: 1,pageSize: 15,tota…

Unity开发的Domino多米诺3D小游戏源码

Unity开发的Domino多米诺3D小游戏源码下载地址

计算机组成原理 - 总线、输入/输出系统

总线 考纲内容 总线的基本概念总线的组成及性能指标总线事务和定时 本章大多以选择题的形式出现&#xff0c;特别是总线的特点、猝发传输方式、性能指标、定时方式及常见的总线标准等 思考以下问题&#xff1a; 1、引入总线结构有什么好处? 2、引入总线结构会导致什么问题…

公司官网为何建议用OV SSL证书?如何申请?

随着网络安全威胁的日益增多&#xff0c;保护用户数据安全变得尤为重要。其中SSL&#xff08;Secure Sockets Layer&#xff09;证书成为了保障网站安全的关键技术之一。而在众多SSL证书中&#xff0c;OV&#xff08;Organization Validation&#xff09;SSL证书因其独特的优势…

JVM(九)深入解析Java字节码技术与执行模型

这篇文章深入探讨了Java字节码技术&#xff0c;包括字节码的简介、获取字节码清单的方法、解读字节码清单、查看class文件中的常量池信息、查看方法信息、线程栈与字节码执行模型、方法体中的字节码解读、对象初始化指令、栈内存操作指令、局部变量表、流程控制指令、算术运算指…

读取压缩文件

读取压缩文件 1、背景 D盘下面有一个zipTest1.zip压缩文件 1.1 zipTest里面的内容 1.2 zipTest中有三个文件夹dir1、dir2、dir3 1.3 每一个文件夹下都有一个.txt文件 2、要求 读取D盘下面zipTest1.zip压缩文件里的内容到D盘下面zipTest2 3、实现 public static void main…

Go语言使用cobra开发第一个命令行程序

源码下载 本教程源码下载地址&#xff1a;https://github.com/zhangdapeng520/zdpgo_cobra_examples 案例说明 实现一个简单的命令行程序&#xff0c;能够将输入的单词转换为大写。 使用演示 执行命令&#xff1a; go run .\main.go word -u -s hello输出结果&#xff1a…

XXE靶机教学

arp-scan -l主机发现 arp-scan -l 端口扫描 nmap -p- 192.168.48.139 服务探测 nmap -p80,5355 -sT -sC -sV 192.168.48.139 目录扫描 dirsearch -u http://192.168.48.139 访问robots.txt 发现两个可访问路径 burp抓包 测试是否存在xxe漏洞 <?xml version "1.…

超声波清洗机性价比高的型号有哪些?四款值得关注的高性能超声波清洗机推荐

如果你发现眼镜变得非常脏&#xff0c;甚至出现青铜色的污渍&#xff0c;那说明是时候清洁眼镜了&#xff01;很多人往往不在意这些细节&#xff0c;结果眼镜越戴越模糊&#xff0c;实际上这主要是因为镜片上的油污、手指皮肤的残留以及生活中的灰尘积累。如果不及时清洁&#…