python爬虫入门(所有演示代码,均有逐行分析!)

news2024/11/26 0:50:15

爬虫的初学者们,只看这一篇就够了,看到就是赚到!

目录

1.爬虫简介

2.版本及库的要求

3.爬虫的框架

4.HTML简介

5.爬虫库及演示

  (1)requests库(网页下载器)

  (2)BeautifulSoup库(网页解析器)

6.爬虫框架补充

  (1)URL管理模块

7.对目标网站进行解析

8.举个栗子

  (1)所需库

  (2)爬取目标

  (3)网页分析

  (4)编写爬虫前的准备

  (5)编写代码

9.参考资料


1.爬虫简介

网络爬虫,也称为网页蜘蛛或网络机器人,是一种自动抓取万维网信息的程序或脚本。

爬虫的基本原理是通过模拟人的网络行为,如点击按钮、查看数据等,来获取服务器上的数据。这些数据可以是文本、图片、视频等多种格式。爬虫分为通用爬虫和聚焦爬虫两大类,其中通用爬虫的目标是在保持一定内容质量的情况下爬取尽可能多的站点,如搜索引擎;而聚焦爬虫则主要针对特定对象或网站,有一台指定的爬取路径、数据抽取规则。

此外,爬虫还被广泛应用于多个领域,如数据聚合、舆情分析、网络安全、税务稽查等。

2.版本及库的要求

2.1python使用版本:3.7.9

2.2爬虫所需库

        [1]resquests

        [2]Beautifulsoup4

        [3]selenium

ps:上述库可通过

pip install requests

直接安装,安装完在pycharm新建test.py文件,输入一下代码进行验证,查看库是否安装成功

import requests
from bs4 import BeautifulSoup
import selenium

print("ok")

若安装成功则输出如下图所示:

 

3.爬虫的框架

(1)   URL管理器:相当于一个数据容器,其中包含待爬取及爬取过的url。

        模块作用:防止爬虫重复爬取页面,或循环爬取陷入死循环中。

(2)网页下载器:用python获取网页的信息。

        模块作用:爬取页面信息。复杂页面的爬取,动态页面,需要登录验证码的页面,或者有一些防御手段禁止爬取的页面,都需要在此模块中解决。(一般网页使用动态加载数据,需要使用到selenium框架解决。)

(3)网页解析器:获取网页下载器下载下来的HTML,提取其中有价值的信息和待爬取的新URL,传输给URL管理器,循环爬取数据。

(4)并发爬取,在爬虫调度端实现。

(5)数据存储,像将数据保存在数据库中,统一在价值数据模块中实现。

        

4.HTML简介

这部分内容简单看一下

想深入了解看可以看看HTML 教程

5.爬虫库及演示

(1)requests库(网页下载器)

一个优雅的、简单的Python、HTTP库,常常用于爬虫对网页内容的下载。

requests库用法:

以下代码可以直接在pycharm中运行,看看返回结果

代码段1:

import requests

url = "http://www.crazyant.net"

r = requests.get(url)

print(r.status_code)
print(r.headers)
print(r.encoding)
print(r.text)
print(r.cookies)

 代码段2:

import requests

#url = “http://www.crazyant.net”
#url = "http://www.baidu.com"
url = "http://www.httpcn.com"

r = requests.get(url)
#r.encoding = "UTF-8"

print(r.status_code)
print(r.headers)
print(r.encoding)
print(r.text)
print(r.cookies)

当编码不规范时,爬取的中文信息中可能会出现乱码,此时需要我们手动更改编码信息

import requests

#url = “http://www.crazyant.net”
#url = "http://www.baidu.com"
url = "http://www.httpcn.com"

r = requests.get(url)
r.encoding = "UTF-8"

print(r.status_code)
print(r.headers)
print(r.encoding)
print(r.text)
print(r.cookies)

更改前:

更改后:

(2)BeautifulSoup库(网页解析器)

BeautifulSoup库官网:Beautiful Soup: We called him Tortoise because he taught us.

 方便练习,我们先自己写一个简单的网页

<html>
<head>
    <meta http-equiv=Content-Type content="text/html;charset=utf-8">
    <title>网页标题</title>
</head>
<body>
    <h1>标题1</h1>
    <h2>标题2</h2>
    <h3>标题3</h3>
    <h4>标题4</h4>

    <div id="content" class="default">
        <p>段落</p>
        <a href="http://www.baidu.com">百度</a> </br>
        <a href="http://www.crazyyant.net">疯狂的蚂蚁</a> </br>
        <a href="http://www.iqiyi.com">爱奇艺</a> </br>
        <img src="http://www.python.org/static/img/python-logo.png"/>
    </div>
</body>
</html>

运行之后长这样:

爬取上述简单网页:

创建一个Python Package,命名为bs4_test

把上述网页放在Package下,命名为test.html

再在Package中创建一个test.py文件

结构如下图:

test.py文件中的代码:

from bs4 import BeautifulSoup

with open("./test.html", encoding="utf-8") as fin:
#打开当前目录下的HTML
    html_doc = fin.read()
    #读取HTML中的内容作为一个字符串

soup = BeautifulSoup(html_doc, "html.parser")
#创建一个BeautifulSoup对象

div_node = soup.find("div", id="content")
#指定查找模块的id为content
print(div_node)
print("#" * 30)

links = soup.find_all("a")
#查找所有用的a节点
for link in links:
    print(link.name, link["href"], link.get_text())
#循环遍历a节点,并将遍历的a节点名称、href属性、文字内容打印出来

img = soup.find("img")
print(img["src"])
#打印图片地址

运行结果:

6.爬虫框架补充

(1)URL管理模块

url管理器的实现代码:

class UrlManager():
    '''
    url管理器
    '''

    def __init__(self):
    #定义一个初始化函数
        self.new_urls = set()
        #新的待爬取url的集合
        self.old_urls = set()
        #已爬取url的集合

    def add_new_url(self, url):
    #定义新增单个url的方法一,传一个参数url
        if url is None or len(url) == 0:
        #判断url是否为空或长度为0
            return
            #符合上述条件就停止增加
        if url in self.new_urls or url in self.old_urls:
        #判断url是否已经被记录在集合里
            return
            #已经载集合里的url不新增
        self.new_urls.add(url)
        #上述干扰条件排除后,url就可以加入待爬取的集合中

    def add_new_urls(self,urls):
    #定义新增url的方法二,传一个参数urls
        if urls is None or len(urls) == 0:
        #判断参数urls是否为空
            return
        for url in urls:
        #不为空就将单个url循环传入单个判断url方法中经行判断存储
            self.add_new_url(url)

    def get_url(self):
    #定义获取新url的函数
        if self.has_new_url():
        #如果存在待爬取的url
            url = self.new_urls.pop()
            #就将待爬取的url从集合中移除并返回
            self.old_urls.add(url)
            #将移除的url加入已爬取的集合中
            return url
            #并将其返回
        else:
            return None

    def has_new_url(self):
    #定义一个判断url是否存在等待爬取的url
        return len(self.new_urls) > 0
        #如果待爬取集合中有元素就分返回这个集合

'''测试代码'''
if __name__ == "__main__":
#文件内置变量,仅在执行当前文件时可用。当此文件被调用时,此出变量不会被执行。因此测试代码时一般加上这句话
    url_manger = UrlManager()
    #调用整个类

    url_manger.add_new_url("url1")
    url_manger.add_new_urls(["url1", "url2"])
    #故意增加一个重复的url
    print(url_manger.new_urls, url_manger.old_urls)

    print("#" * 30)
    new_url = url_manger.get_url()
    print(url_manger.new_urls, url_manger.old_urls)

    print("#" * 30)
    new_url = url_manger.get_url()
    print(url_manger.new_urls, url_manger.old_urls)

    print("#" * 30)
    print(url_manger.has_new_url())

7.对目标网站进行解析

这点需要听课,来来来都给我听!(作者用的不是Windows系统,有点不一样,不影响,稳!)

[2.8]--爬虫前提之对目标网站进行分析_哔哩哔哩_bilibili

听不懂没关系,有个印象就行

8.举个栗子

(1)所需库

        [1]requests

        [2]BeautifulSoup

(2)爬取目标

        网页的所有标题的文本和链接

(3)网页分析

        打开检查,鼠标点击到标题,定位到它的源码

 可以看到标提包裹在h2标签中,class="entry-title"

往下多看几个,发现都是这样的

 

我们就可以指定查找模块h2,class为class="entry-title"

(4)编写爬虫前的准备

        [1]新建一个python package,命名为blog_test

        [2]新建一个main.py文件

(5)编写代码
import requests
from bs4 import BeautifulSoup

url = "http://www.crazyant.net/"

r = requests.get(url)
if r.status_code != 200:
    raise Exception()
    #程序出现问题,退出程序

html_doc = r.text
#获取文本
soup = BeautifulSoup(html_doc, "html.parser")
#定义变量

h2_nodes = soup.find_all("h2", class_="entry-title")
#找到h2,class_="enter-title"

for h2_node in h2_nodes:
     #h2_node是h2_nodes中的一条信息
    link = h2_node.find("a")
    #在查找的信息内,找到a标签的内容,传递给参数link
    print(link["href"], link.get_text())
    #输出a标签中herf属性,和文本内容

9.参考资料

B站视频:

python爬虫入门实战案例教程-入门到精通(收藏版)_哔哩哔哩_bilibili

爬虫简介参考:

搜索智能精选

Python部分语法:

Python 中的 if __name=='__main__'作用浅析 - 简书

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

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

相关文章

Verilog复习(三)| Verilog语言基础

四种基本的逻辑值 0&#xff1a;逻辑0或“假”1&#xff1a;逻辑1或“真”x&#xff1a;未知z&#xff1a;高阻 三类常量 整型数&#xff1a;简单的十进制格式&#xff0c;基数格式&#xff08;5’O37&#xff0c;4’B1x_01&#xff09; 格式&#xff1a; <size><’b…

AI中转站计费平台系统源码一站式解决方案安装说明

AI中转站计费平台系统源码一站式解决方案安装说明 功能 | Features AI 联网功能 AI online searching service 多账户均衡负载 Multi-account load balancing HTTP2 Stream 实时响应功能 HTTP2 Stream real-time response function 节流和鉴权体系 Throttling and authenticati…

PCB打标机3段翻板和2段翻板的区别

随着电子技术的发展&#xff0c;电子产品的更新换代速度越来越快&#xff0c;对PCB打标机的需求也越来越大。PCB打标机是一种用于在PCB板上刻划文字、图案、条形码等信息的设备&#xff0c;广泛应用于FPC、LED灯、电源板等领域。其中&#xff0c;3段翻板和2段翻板是两种常见的P…

DBCHM 数据库 CHM 文档生成工具

介绍 DBCHM 是一款数据库文档生成工具&#xff01; 该工具从最初支持chm文档格式开始&#xff0c;通过开源&#xff0c;集思广益&#xff0c;不断改进&#xff0c;又陆续支持word、excel、pdf、html、xml、markdown等文档格式的导出。 支持的数据库 SqlServerMySQLOraclePos…

Java入门基础学习笔记2——JDK的选择下载安装

搭建Java的开发环境&#xff1a; Java的产品叫JDK&#xff08;Java Development Kit&#xff1a; Java开发者工具包&#xff09;&#xff0c;必须安装JDK才能使用Java。 JDK的发展史&#xff1a; LTS&#xff1a;Long-term Support&#xff1a;长期支持版。指的Java会对这些版…

3. 多层感知机算法和异或门的 Python 实现

前面介绍过感知机算法和一些简单的 Python 实践&#xff0c;这些都是单层实现&#xff0c;感知机还可以通过叠加层来构建多层感知机。 2. 感知机算法和简单 Python 实现-CSDN博客 1. 多层感知机介绍 单层感知机只能表示线性空间&#xff0c;多层感知机就可以表示非线性空间。…

TCP是如何实现可靠传输的 UDP面向报文 TCP面向字节流是什么意思 TCP和UDP分别适用于什么场合

UDP是用户数据报协议&#xff0c;它是一种无连接的传输层协议&#xff0c;它面向报文&#xff0c;也就是说&#xff0c;UDP对应用层交下来的报文&#xff0c;在添加UDP头之后直接发送出去&#xff0c;不会对数据进行拆分和合并。因此&#xff0c;UDP传输的数据单位是报文&#…

STM32编译前置条件配置

本文基于stm32f104系列芯片&#xff0c;记录编程代码前需要的操作&#xff1a; 添加库文件 在ST官网下载标准库STM32F10x_StdPeriph_Lib_V3.5.0&#xff0c;解压后&#xff0c;得到以下界面 启动文件 进入Libraries&#xff0c;然后进入CMSIS&#xff0c;再进入CM3&#xff…

RERCS系统-WDA+BOPF框架实战例子 PART 1-新建List UIBB(列表组件)并分配Feeder Class和Node Element

需求背景&#xff1a; 已有的项目主数据功能&#xff0c;新增一个列表UIBB显示主数据额外的关联数据明细。 1、Fiori页面通过右键-技术帮助打开对应的组件配置&#xff1b; 2、双击对应的组件配置&#xff0c;调整对应的页面新建UIBB&#xff1b; 3、填写对应的UIBB属性字段&a…

【数据结构】 二叉树的顺序结构——堆的实现

普通的二叉树是不适合用数组来存储的&#xff0c;因为可能会存在大量的空间浪费。而完全二叉树更适合使用顺序结构存储。现实中我们通常把堆(一种二叉树)使用顺序结构的数组来存储 。 一、堆的概念及结构 父节点比孩子结点大 是大堆 父节点比孩子结点小 是小堆 堆的性质 堆中某…

世界上知名度最高的人物颜廷利:精神与物质的对岸有五种类型的人

世界上知名度最高的人物颜廷利&#xff1a;精神与物质的对岸有五种类型的人 面对现实生活中的物质生活和精神生活而言&#xff0c;确切的说&#xff0c;实际上总共可以划分为五种类型的人&#xff1a; 第一种&#xff0c;隔河观望的人&#xff0c;他们总是以‘物质’&#xff0…

Matlab: ode45解微分方程——以弹簧振子模型为例

简介&#xff1a; 在科学和工程中&#xff0c;我们经常遇到描述事物变化的微分方程。这些方程可以帮助我们理解从行星运动到药物在体内的扩散等各种现象。但是&#xff0c;很多微分方程非常复杂&#xff0c;手动求解几乎不可能。这时&#xff0c;我们就可以使用像 ode45这样的…

【Linux】冯诺依曼体系

冯诺依曼体系 冯诺依曼体系结构是我们计算机组成的基本架构 中央处理器&#xff08;CPU&#xff09;&#xff1a; 中央处理器是冯诺伊曼体系的核心部分&#xff0c;负责执行计算机程序中的指令。它包括算术逻辑单元&#xff08;ALU&#xff09;和控制单元&#xff08;CU&#x…

【JavaWeb】网上蛋糕商城后台-商品管理

概念 本文讲解和实现网上蛋糕商城的后台管理系统中的商品管理功能。 商品列表 点击后台管理系统的head.jsp头部的“商品管理”功能选项&#xff0c;向服务器发送请求/admin/goods_list 因此需要在servlet包中创建AdminGoodsListServlet类&#xff0c;用于获取商品信息列表 …

拷贝构造、赋值运算符、运算符重载

&#x1f436;博主主页&#xff1a;ᰔᩚ. 一怀明月ꦿ ❤️‍&#x1f525;专栏系列&#xff1a;线性代数&#xff0c;C初学者入门训练&#xff0c;题解C&#xff0c;C的使用文章&#xff0c;「初学」C&#xff0c;linux &#x1f525;座右铭&#xff1a;“不要等到什么都没有了…

二叉树的广度优先遍历 - 华为OD统一考试(D卷)

OD统一考试(D卷) 分值: 200分 题解: Java / Python / C++ 题目描述 有一棵二叉树,每个节点由一个大写字母标识(最多26个节点)。 现有两组字母,分别表示后序遍历(左孩子->右孩子->父节点)和中序遍历(左孩子->父节点->右孩子)的结果,请输出层次遍历的结…

视频号小店应该怎么去做呢?新手必看!一篇详解!

大家好&#xff0c;我是电商小V 视频号小店就是腾讯推出的新项目&#xff0c;目前正处于红利期&#xff0c;现在也是入驻的好时机&#xff0c;背靠腾讯平台&#xff0c;是为商家提供商品信息展示&#xff0c;商品交易&#xff0c;支持商家在视频号场景内开店经营的官方平台&…

六、Redis五种常用数据结构-zset

zset是Redis的有序集合数据类型&#xff0c;但是其和set一样是不能重复的。但是相比于set其又是有序的。set的每个数据都有一个double类型的分数&#xff0c;zset正是根据这个分数来进行数据间的排序从小到大。有序集合中的元素是唯一的&#xff0c;但是分数(score)是可以重复的…

51单片机软件环境安装

keli5的安装 把CID放到破解程序中 破解程序会给一串数字然后填到那个框中 驱动程序的安装 安装完了以后 设备管理器会出现这个 同时c盘会出现这个文件夹

好题总结汇总

好题总结汇总 总结一些做完很有收获的题。 一、经典问题 DP的结合 1、题意&#xff1a; 给定 n n n 种颜色的球的数量 a 1 , a 2 , . . . , a n a_1, a_2, ..., a_n a1​,a2​,...,an​&#xff0c;选出一些不同种类的球(也就是在n种球中选球的任意情况)&#xff0c;将球…