基于python对网页进行爬虫简单教程

news2024/12/19 19:50:25

python对网页进行爬虫

基于BeautifulSoup的爬虫—源码

"""
基于BeautifulSoup的爬虫

### 一、BeautifulSoup简介

1. Beautiful Soup提供一些简单的、python式的函数用来处理导航、搜索、修改分析树等功能。它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出一个完整的应用程序。
2. Beautiful Soup自动将输入文档转换为Unicode编码,输出文档转换为utf-8编码。你不需要考虑编码方式,除非文档没有指定一个编码方式,这时,Beautiful
3. Soup就不能自动识别编码方式了。然后,你仅仅需要说明一下原始编码方式就可以了。
4. Beautiful Soup已成为和lxml、html6lib一样出色的python解释器,为用户灵活地提供不同的解析策略或强劲的速度。
5. BS基于DOM结构进行页面内容解析,当开始解析时,会将整个页面的DOM树保存于内存中,进而实现查找。
解析器:
1. Python标准库 BeautifulSoup(markup, "html.parser") - Python的内置标准库,执行速度适中,文档容错能力强
2. lxml HTML解析器 BeautifulSoup(markup, "lxml") - 速度快,文档容错能力强,需要安装C语言库
3. lxml XML解析器 BeautifulSoup(markup, "xml") - 速度快,唯一支持XML的解析器,需要安装C语言库
4. html5lib BeautifulSoup(markup, "html5lib") - 最好的容错性,以浏览器的方式解析文档,生成HTML5格式的文档,速度慢,不依赖外部扩展

### 二、具体代码使用
"""
from bs4 import BeautifulSoup
import requests

resp = requests.get('https://www.cnblogs.com/leyinsec')

# 初始化解析器
html = BeautifulSoup(resp.text, 'lxml')


# 查找页面元素,根据标签层次进行查找
# print(html.head.title)
# print(html.head.title.string)
# print(html.div)
# print(html.div.div)
# 查找页面元素的通用方法,find_all,select


# 查找页面所有超链接
def html_href():
    links = html.find_all('a')
    for link in links:
        try:
            print(link['href'])
        except KeyError:
            print("No href attribute found for this tag")


# 查找页面图片
def html_images():
    images = html.find_all('img')
    for image in images:
        print(image['src'])


"""
# 根据id或calss等属性查找
keyword = html.find_all(id='keyword')
print(keyword)
print(keyword['placeholder'])

# 根据title查找
titles = html.find_all(class_='title')
for title in titles:
    print(title)
    print(title.find('a'))

# 根据text查找
title = html.find(text='leyinsec')
print(title.parent)

# 根据xpath的风格进行查找 //[@class='title' and/or @id=1]
titles = html.find_all('div', {'class': 'title'})
for title in titles:
    print(title)
    
# css选择器
titles = html.select('div.title')
for title in titles:
    print(title)
    
# css选择器查找id
keyword = html.select('#keyword')
try:
    print(keyword['placeholder'])
except TypeError:
    print("No keyword attribute found for this tag")

# 列表查找
lis = html.select('ul li')
print(lis)
"""

if __name__ == '__main__':
    html_images()

基于BeautifulSoup的爬虫—源码解析

这段代码是一个基于BeautifulSoup库的简单爬虫示例,用于从指定的网页中提取超链接和图片链接。下面是对代码的详细分析:

导入库

from bs4 import BeautifulSoup
import requests

这两行代码导入了编写爬虫所需的两个库:BeautifulSoup用于解析HTML文档,requests用于发送HTTP请求。

发送HTTP请求

resp = requests.get('https://www.cnblogs.com/leyinsec')

这行代码使用requests库向指定的URL发送GET请求,并将响应存储在变量resp中。

解析HTML文档

html = BeautifulSoup(resp.text, 'lxml')

这行代码使用BeautifulSoup解析HTTP响应中的文本内容。这里使用了'lxml'作为解析器,因为它通常比Python内置的解析器更快且具有更好的容错性。

定义查找页面元素的函数

查找所有超链接
def html_href():
    links = html.find_all('a')
    for link in links:
        try:
            print(link['href'])
        except KeyError:
            print("No href attribute found for this tag")

这个函数查找HTML文档中所有的<a>标签,并尝试打印出每个链接的href属性。如果某个<a>标签没有href属性,则会捕获KeyError异常并打印一条消息。

查找所有图片
def html_images():
    images = html.find_all('img')
    for image in images:
        print(image['src'])

这个函数查找HTML文档中所有的<img>标签,并打印出每个图片的src属性。

根据属性查找元素

keyword = html.find_all(id='keyword')
print(keyword)
print(keyword['placeholder'])

这段代码尝试查找具有特定id属性的元素,并打印出该元素及其placeholder属性。但是这里有一个错误:keyword是一个列表,所以不能直接使用keyword['placeholder']。应该遍历列表并分别访问每个元素的属性。

根据类名查找元素

titles = html.find_all(class_='title')
for title in titles:
    print(title)
    print(title.find('a'))

这段代码查找所有具有title类的元素,并打印出这些元素及其内部包含的<a>标签。

根据文本查找元素

title = html.find(text='leyinsec')
print(title.parent)

这段代码查找文本内容为leyinsec的元素,并打印出该元素的父元素。

使用CSS选择器查找元素

titles = html.select('div.title')
for title in titles:
    print(title)

这段代码使用CSS选择器语法查找所有具有title类的<div>元素,并打印它们。

查找具有特定ID的元素

keyword = html.select('#keyword')
try:
    print(keyword['placeholder'])
except TypeError:
    print("No keyword attribute found for this tag")

这段代码试图查找具有特定ID的元素,并打印其placeholder属性。但是这里同样有一个错误:keyword是一个列表,所以不能直接使用keyword['placeholder']。应该遍历列表并分别访问每个元素的属性。

列表查找

lis = html.select('ul li')
print(lis)

这段代码查找所有在<ul>标签内的<li>元素,并打印出这个列表。

主函数调用

if __name__ == '__main__':
    html_images()

这段代码确保当脚本作为主程序运行时,调用html_images()函数来执行图片链接的查找和打印。

总结

这段代码展示了如何使用BeautifulSoup库来解析HTML文档,并通过不同的方法查找和提取页面元素。需要注意的是,代码中有一些错误需要修正,特别是在处理查找结果为列表的情况时。此外,代码中没有处理网络请求可能出现的异常,例如连接错误或HTTP错误状态码。在实际应用中,应该添加适当的异常处理来提高代码的健壮性。

基于正则表达式的爬虫—源码

"""
基于正则表达式的爬虫

以下是提取的文章内容:

### 一、爬虫简介

1. **搜索引擎**:百度,谷歌,企业内部的知识库,某些项目专项数据爬取,专业的数据爬取。
2. **互联网**:
   - 公网(不需要授权的情况就可以浏览的内容,搜索引擎的重点)
   - 深网(需要授权才能使用的内容)
   - 暗网(非正式渠道,无法使用常规手段访问)
3. **爬取互联网的公开信息**,但是正常情况下,也需要遵守一个规则:robots协议:[https://www.baidu.com/robots.txt](https://www.baidu.com/robots.txt)(君子协议)

### 二、基本原理

1. **所有和网页,均是HTML**:
   - HTML首先是一个大的字符串,可以按照字符串处理的方式对响应进行解析处理。
   - 其次,HTML本身也是一门标记语言,与XML是同宗同源,所以可以使用DOM对其文本进行处理。
2. **所有的爬虫,核心基于超链接**,进而实现网站和网页的跳转。给我一个网站,爬遍全世界。
3. **如果要实现一个整站爬取**,首先要收集到站内所有网址,并且将重复网址去重,开始爬取内容并保存在本地数据库,进行实现后续目标。
### 三、正则表达式实现
"""
import re
import time

import requests


def download_page():
    resp = requests.get('https://www.cnblogs.com/leyinsec')
    # 解析网页所有超链接
    links = re.findall('<a href="(.+?)"', resp.text)
    for link in links:
        # 排除无用链接
        if 'postid' in link or 'archive' in link:
            continue
        elif link.startswith('javascript'):
            continue
        # 将页面文件保存在本地
        resp = requests.get(link)
        resp.encoding = 'utf-8'
        filename = link.split('/')[-1] + time.strftime("_%Y%m%d_%H%M%S") + '.html'
        with open(f'page/leyinsec博客园/{filename}', 'w', encoding='utf-8') as file:
            file.write(resp.text)


def download_images():
    resp = requests.get('https://www.cnblogs.com/leyinsec')
    images = re.findall('<img src="(.+?)"', resp.text)
    for image in images:
        if image.startswith('/'):
            image = 'https://www.cnblogs.com/leyinsec' + image
    # 下载图片
        resp = requests.get(image)
        filename = time.strftime("_%Y%m%d_%H%M%S") + image.split('/')[-1]
        with open('page/leyinsec博客园/photos/' + filename, 'wb') as file:
            file.write(resp.content)


if __name__ == '__main__':
    download_page()
    download_images()

基于正则表达式的爬虫—源码解析

这段代码是一个简单的基于正则表达式的爬虫,用于从指定的网页中提取超链接和图片链接,并将它们保存到本地文件系统中。下面是对代码的详细分析:

导入库

import re
import time
import requests

这三行代码导入了编写爬虫所需的三个库:re用于处理正则表达式,time用于处理时间相关的功能,requests用于发送HTTP请求。

下载网页内容的函数

def download_page():
    resp = requests.get('https://www.cnblogs.com/leyinsec')
    # 解析网页所有超链接
    links = re.findall('<a href="(.+?)"', resp.text)
    for link in links:
        # 排除无用链接
        if 'postid' in link or 'archive' in link:
            continue
        elif link.startswith('javascript'):
            continue
        # 将页面文件保存在本地
        resp = requests.get(link)
        resp.encoding = 'utf-8'
        filename = link.split('/')[-1] + time.strftime("_%Y%m%d_%H%M%S") + '.html'
        with open(f'page/leyinçsec博客园/{filename}', 'w', encoding='utf-8') as file:
            file.write(resp.text)

这个函数首先发送一个GET请求到指定的URL,然后使用正则表达式查找所有的超链接。对于每个找到的链接,它会检查链接是否包含特定的字符串(如'postid'或'archive'),或者是否以'javascript'开头,如果是,则跳过该链接。对于其他链接,它会发送另一个GET请求以获取网页内容,并将其保存到本地文件系统中,文件名包含时间戳以确保唯一性。

下载图片的函数

def download_images():
    resp = requests.get('https://www.cnblogs.com/leyinsec')
    images = re.findall('<img src="(.+?)"', resp.text)
    for image in images:
        if image.startswith('/'):
            image = 'https://www.cnblogs.com/leyinsec' + image
    # 下载图片
        resp = requests.get(image)
        filename = time.strftime("_%Y%m%d_%H%M%S") + image.split('/')[-1]
        with open('page/leyinsec博客园/photos/' + filename, 'wb') for file:
            file.write(resp.content)

这个函数的工作方式与download_page函数类似,但是它查找的是<img>标签中的src属性。对于每个找到的图片链接,如果链接是相对路径(以'/'开头),它会将其转换为绝对路径。然后,它会发送GET请求以下载图片,并将其保存到本地文件系统中,文件名同样包含时间戳。

主函数调用

if __name__ == '__main__':
    download_page()
    download_images()

这段代码确保当脚本作为主程序运行时,调用download_page()download_images()函数来执行网页内容和图片的下载。

注意事项和潜在问题

  1. 硬编码的URL:代码中硬编码了要爬取的网站URL,这限制了脚本的通用性。

  2. 缺乏异常处理:代码中没有处理网络请求可能出现的异常,例如连接错误或HTTP错误状态码。

  3. 缺乏robots.txt检查:代码没有检查目标网站的robots.txt文件,这可能会违反网站的爬虫政策。

  4. 文件路径错误:在download_page函数中,文件路径字符串有一个小错误,leyinçsec应该是leyinsec

  5. 重复下载:代码没有实现去重逻辑,可能会下载重复的网页或图片。

  6. 编码问题:代码假设所有网页和图片都可以使用UTF-8编码,这可能不总是正确的。

  7. 性能问题:对于大型网站,这种简单的递归下载方法可能会导致大量的并发请求,从而对目标服务器造成压力。

总结

这段代码展示了如何使用正则表达式和requests库来爬取网页内容和图片,并将它们保存到本地。然而,代码中存在一些问题和潜在的改进空间,特别是在异常处理、遵守robots.txt规则、错误处理和性能方面。在实际应用中,应该考虑这些问题,并采取相应的措施来提高代码的健壮性和效率。

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

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

相关文章

C语言中文件是什么?文件文本和二进制文件的区别

1、C语言中文件是什么&#xff1f; 我们对文件的概念已经非常熟悉了&#xff0c;比如常见的 Word 文档、txt 文件、源文件等。文件是数据源的一种&#xff0c;最主要的作用是保存数据。 在操作系统中&#xff0c;为了统一对各种硬件的操作&#xff0c;简化接口&#xff0c;不同…

vmware workstation pro上创建虚拟机

vmware workstation pro上创建虚拟机 下载vmware workstation pro软件安装后并运行点击主页&#xff0c;选择创建虚拟机 创建虚拟机成功后会出现如下界面 可以点击设置按钮删除不需要的硬件&#xff0c;也可以添加新的硬件设备&#xff0c;最终硬件信息如下图 至此虚拟机…

【数学建模】利用Matlab绘图(2)

一、Matlab中plot函数的基本用法 在matlab中&#xff0c;函数的基本用法主要包括以下几种 第一类&#xff1a; plot(X,Y,LineSpec) 第二类&#xff1a; plot(tbl,xvar,yvar) 1.1 第一类 1.1.1x-y坐标 x和y的选择取决于绘图所需的数据类型以及图像的类型。下表列出了几种…

ASP.NET Core - 依赖注入 自动批量注入

依赖注入配置变形 随着业务的增长&#xff0c;我们项目工作中的类型、服务越来越多&#xff0c;而每一个服务的依赖注入关系都需要在入口文件通过Service.Add{}方法去进行注册&#xff0c;这将是非常麻烦的&#xff0c;入口文件需要频繁改动&#xff0c;而且代码组织管理也会变…

Oracle 适配 OpenGauss 数据库差异语法汇总

背景 国产化进程中&#xff0c;需要将某项目的数据库从 Oracle 转为 OpenGauss &#xff0c;项目初期也是规划了适配不同数据库的&#xff0c;MyBatis 配置加载路径设计的是根据数据库类型加载指定文件夹的 xml 文件。 后面由于固定了数据库类型为 Oracle 后&#xff0c;只写…

Kubeadm+Containerd部署k8s(v1.28.2)集群(非高可用版)

Kubeadm+Containerd部署k8s(v1.28.2)集群(非高可用版) 文章目录 Kubeadm+Containerd部署k8s(v1.28.2)集群(非高可用版)一.环境准备1.服务器准备2.环境配置3.设置主机名4.修改国内镜像源地址5.配置时间同步6.配置内核转发及网桥过滤二.容器运行时Containerd安装(所有节点)…

[LeetCode-Python版]21. 合并两个有序链表(迭代+递归两种解法)

题目 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4] 示例 2&#xff1a; 输入&#xff1a;l1 [], l2 [] 输出&#x…

MATLAB引用矩阵元素的几种方法

引用矩阵元素可以通过索引&#xff0c;也可以通过逻辑值 索引 通过引用元素在矩阵中的位置来提取元素&#xff0c;例如&#xff1a; - 逻辑值 通过某种逻辑运算来使得要提取的值变为逻辑 1 1 1&#xff0c;用 A ( ) A() A()提取即可&#xff0c; A A A为原矩阵的名称。 例如&…

sql 批量修改字段 的默认值

SELECT COLUMN_NAME, NUMERIC_PRECISION, NUMERIC_SCALE FROM information_schema.COLUMNS WHERE TABLE_SCHEMA financeproject AND TABLE_NAME finance_balance AND DATA_TYPE decimal; 查出的字段 excel 拼接 修改语句 ALTER TABLE finance_income MODIFY COLUMN yy…

CVE-2023-0562【春秋云镜】

目录 CVE-2023-0562漏洞概述漏洞利用方式影响范围修复建议安全编码示例靶标介绍 CVE-2023-0562 CVE-2023-0562 是一个针对银行储物柜管理系统的SQL注入漏洞。该漏洞影响了储物柜管理系统中处理用户输入的部分&#xff0c;攻击者可以利用此漏洞未经授权地访问数据库中的敏感信息…

vue el-dialog实现可拖拉

el-dialog实现拖拉&#xff0c;每次点击度居中显示&#xff0c;以下贴出代码具体实现&#xff0c;我是可以正常拖拉并且每次度显示在中间&#xff0c;效果还可以&#xff0c;需要的可以丢上去跑跑 组件部分&#xff1a; <el-dialog:visible.sync"dialogVisible"…

MySQL:库和表的操作

目录 一. 查看数据库 二. 创建数据库 三. 字符集和校验规则 四. 修改和删除数据库 4.1 数据库修改 4.2 数据库删除 五. 备份与恢复 5.1 备份 5.2 还原 5.3 注意事项 5.4 查看连接情况 六. 创建表 七. 查看表结构 八. 修改表 九. …

gitlab初始化+API批量操作

几年没接触gitlab了&#xff0c;新版本装完以后代码提交到默认的main分支&#xff0c;master不再是主分支 项目有几十个仓库&#xff0c;研发提交代码后仓库地址和之前的发生了变化 有几个点 需要注意 1、修改全局默认分支 2、关闭分支保护 上面修改了全局配置不会影响已经创…

Java集合(完整版)

集合框架 Collection集合 概念&#xff1a;对象的容器&#xff0c;定义了对多个对象进行操作的常用方法。可以实现数组的功能 和数组的区别&#xff1a; 数组的长度固定&#xff0c;集合长度不固定数组可以存储基本类型和引用类型&#xff0c;集合只能存储引用类型 Collec…

常耀斌:深度学习和大模型原理与实战(深度好文)

目录 机器学习 深度学习 Transformer大模型架构 人工神经元网络 卷积神经网络 深度学习是革命性的技术成果&#xff0c;有利推动了计算机视觉、自然语言处理、语音识别、强化学习和统计建模的快速发展。 深度学习在计算机视觉领域上&#xff0c;发展突飞猛进&#xff0c;…

不能通过 ip 直接访问 共享盘 解决方法

from base_config.config import OpenSMB, SMB import os, time, calendar, requests, decimal, platform, fs.smbfsinfo_dict SMB.EPDI_dict info_dict[host] (FS03,10.6.12.182) info_dict[direct_tcp] True# smb OpenSMB(info_dict)print(ok)# 根据 ip 查询电脑名 impor…

Mapbox-GL 的源码解读的一般步骤

Mapbox-GL 是一个非常优秀的二三维地理引擎&#xff0c;随着智能驾驶时代的到来&#xff0c;应用也会越来越广泛&#xff0c;关于mapbox-gl和其他地理引擎的详细对比&#xff08;比如CesiumJS&#xff09;&#xff0c;后续有时间会加更。地理首先理解 Mapbox-GL 的源码是一项复…

HIVE4.0.1在Hadoop HA部署hiveserver2模式

本文基于CENTOS7&#xff0c;在Hadoop3.4.0版本vm虚拟机3节点HA集群的基础上进行的搭建。 一、前置条件 本文使用MySQL8.0.26作为HIVE数据库&#xff0c;不使用hive自带的derby数据库&#xff0c;因为其不支持多客户端访问&#xff0c;也不方便查询。 所以必须先安装MySQL。版本…

Visual Studio 使用 GitHub Copilot 协助调试

&#x1f380;&#x1f380;&#x1f380;【AI辅助编程系列】&#x1f380;&#x1f380;&#x1f380; Visual Studio 使用 GitHub Copilot 与 IntelliCode 辅助编码Visual Studio 安装和管理 GitHub CopilotVisual Studio 使用 GitHub Copilot 扩展Visual Studio 使用 GitHu…

C10.【C++ Cont】字符数组和万能头

目录 1.字符数组 1.初始化 1.按字符串初始化 2.按字符初始化 2.字符串的输入 1.无空格的字符串 2.带空格的字符串 解决方法 1.gets(了解即可) gets不安全的原因 2.fgets 3.改良后的scanf 4.getchar 3.字符数组的输出 2.C万能头 1.字符数组 C语言风格的字符串:用…