ython中有非常多用于网络数据采集的库,功能非常强大,有的用于抓取网页,有的用于解析网页,这里介绍6个最常用的库。
BeautifulSoup是最常用的Python网页解析库之一,可将 HTML 和 XML 文档解析为树形结构,能更方便地识别和提取数据。
BeautifulSoup可以自动将输入文档转换为 Unicode,将输出文档转换为 UTF-8。此外,你还可以设置 BeautifulSoup 扫描整个解析页面,识别所有重复的数据(例如,查找文档中的所有链接),只需几行代码就能自动检测特殊字符等编码。
from bs4 import BeautifulSoup
# 假设这是我们从某个网页获取的HTML内容(这里直接以字符串形式给出)
html_content = """
<html>
<head>
<title>示例网页</title>
</head>
<body>
<h1>欢迎来到BeautifulSoup示例</h1>
<p class="introduction">这是一个关于BeautifulSoup的简单示例。</p>
<a href="https://www.example.com/about" class="link">关于我们</a>
</body>
</html>
"""
# 使用BeautifulSoup解析HTML内容,这里默认使用Python的html.parser作为解析器
# 你也可以指定其他解析器,如'lxml'或'html5lib',但需要先安装它们
soup = BeautifulSoup(html_content, 'html.parser')
# 提取并打印<title>标签的文本内容
print("网页标题:", soup.title.string) # 网页标题: 示例网页
# 提取并打印<p>标签的文本内容,这里使用class属性来定位
print("介绍内容:", soup.find('p', class_='introduction').string) # 介绍内容: 这是一个关于BeautifulSoup的简单示例。
# 提取并打印<a>标签的href属性和文本内容
link = soup.find('a', class_='link')
print("链接地址:", link['href']) # 链接地址: https://www.example.com/about
print("链接文本:", link.string) # 链接文本: 关于我们
# 注意:如果HTML内容中包含多个相同条件的标签,你可以使用find_all()来获取它们的一个列表
# 例如,要获取所有<a>标签的href属性,可以这样做:
all_links = [a['href'] for a in soup.find_all('a')]
print("所有链接地址:", all_links) # 假设HTML中有多个<a>标签,这里将列出它们的href属性
# 注意:上面的all_links列表在当前的HTML内容中只有一个元素,因为只有一个<a>标签
Scrapy是一个流行的高级爬虫框架,可快速高效地抓取网站并从其页面中提取结构化数据。
由于 Scrapy 主要用于构建复杂的爬虫项目,并且它通常与项目文件结构一起使用
Scrapy 不仅仅是一个库,还可以用于各种任务,包括监控、自动测试和数据挖掘。这个 Python 库包含一个内置的选择器(Selectors)功能,可以快速异步处理请求并从网站中提取数据。
# 假设这个文件名为 my_spider.py,但它实际上应该放在 Scrapy 项目的 spiders 文件夹中
import scrapy
class MySpider(scrapy.Spider):
# Spider 的名称,必须是唯一的
name = 'example_spider'
# 允许爬取的域名列表(可选)
# allowed_domains = ['example.com']
# 起始 URL 列表
start_urls = [
'http://example.com/',
]
def parse(self, response):
# 这个方法用于处理每个响应
# 例如,我们可以提取网页的标题
title = response.css('title::text').get()
if title:
# 打印标题(在控制台输出)
print(f'Title: {title}')
# 你还可以继续爬取页面中的其他链接,这里只是简单示例
# 例如,提取所有链接并请求它们
# for href in response.css('a::attr(href)').getall():
# yield scrapy.Request(url=response.urljoin(href), callback=self.parse)
# 注意:上面的代码只是一个 Spider 类的定义。
# 要运行这个 Spider,你需要将它放在一个 Scrapy 项目中,并使用 scrapy crawl 命令来启动爬虫。
# 例如,如果你的 Scrapy 项目名为 myproject,并且你的 Spider 文件名为 my_spider.py,
# 那么你应该在项目根目录下运行以下命令:
# scrapy crawl example_spider
Selenium 是一款基于浏览器地自动化程序库,可以抓取网页数据。它能在 JavaScript 渲染的网页上高效运行,这在其他 Python 库中并不多见。
在开始使用 Python 处理 Selenium 之前,需要先使用 Selenium Web 驱动程序创建功能测试用例。
Selenium 库能很好地与任何浏览器(如 Firefox、Chrome、IE 等)配合进行测试,比如表单提交、自动登录、数据添加/删除和警报处理等。
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# 设置WebDriver的路径(根据你的系统路径和WebDriver版本修改)
driver_path = '/path/to/your/chromedriver'
# 初始化WebDriver
driver = webdriver.Chrome(executable_path=driver_path)
try:
# 打开网页
driver.get('https://www.example.com')
# 等待页面加载完成(这里使用隐式等待,针对所有元素)
# 注意:隐式等待可能会影响性能,通常在脚本开始时设置一次
driver.implicitly_wait(10) # 秒
# 查找并输入文本到搜索框(假设搜索框有一个特定的ID或类名等)
# 这里以ID为'search'的输入框为例
search_box = driver.find_element(By.ID, 'search')
search_box.send_keys('Selenium WebDriver')
# 提交搜索(假设搜索按钮是一个类型为submit的按钮或是一个可以点击的输入框)
# 如果搜索是通过按Enter键触发的,可以直接在search_box上使用send_keys(Keys.ENTER)
# 这里假设有一个ID为'submit'的按钮
submit_button = driver.find_element(By.ID, 'submit')
submit_button.click()
# 等待搜索结果加载完成(这里使用显式等待作为示例)
# 假设搜索结果页面有一个特定的元素,我们等待它出现
wait = WebDriverWait(driver, 10) # 等待最多10秒
element = wait.until(EC.presence_of_element_located((By.ID, 'results')))
# 执行其他操作...
finally:
# 关闭浏览器
driver.quit()
不用多说,requests 是 Python 中一个非常流行的第三方库,用于发送各种 HTTP 请求。它简化了 HTTP 请求的发送过程,使得从网页获取数据变得非常简单和直观。
requests 库提供了丰富的功能和灵活性,支持多种请求类型(如 GET、POST、PUT、DELETE 等),可以发送带有参数、头信息、文件等的请求,并且能够处理复杂的响应内容(如 JSON、XML 等)。
import requests
# 目标URL
url = 'https://httpbin.org/get'
# 发送GET请求
response = requests.get(url)
# 检查请求是否成功
if response.status_code == 200:
# 打印响应内容
print(response.text)
else:
# 打印错误信息
print(f'请求失败,状态码:{response.status_code}')
urllib3 是 Python内置网页请求库,类似于 Python 中的requests库,主要用于发送HTTP请求和处理HTTP响应。它建立在Python标准库的urllib模块之上,但提供了更高级别、更健壮的API。
urllib3可以用于处理简单身份验证、cookie 和代理等复杂任务。
import urllib3
# 创建一个HTTP连接池
http = urllib3.PoolManager()
# 目标URL
url = 'https://httpbin.org/get'
# 使用连接池发送GET请求
response = http.request('GET', url)
# 检查响应状态码
if response.status == 200:
# 打印响应内容(注意:urllib3默认返回的是bytes类型,这里我们将其解码为str)
print(response.data.decode('utf-8'))
else:
# 如果响应状态码不是200,则打印错误信息
print(f'请求失败,状态码:{response.status}')
# 注意:urllib3没有直接的方法来处理JSON响应,但你可以使用json模块来解析
# 如果响应内容是JSON,你可以这样做:
# import json
# json_response = json.loads(response.data.decode('utf-8'))
# print(json_response)
lxml是一个功能强大且高效的Python库,主要用于处理XML和HTML文档。它提供了丰富的API,使得开发者可以轻松地读取、解析、创建和修改XML和HTML文档。
from lxml import etree
# 假设我们有一段HTML或XML内容,这里以HTML为例
html_content = """
<html>
<head>
<title>示例页面</title>
</head>
<body>
<h1>欢迎来到我的网站</h1>
<p class="description">这是一个使用lxml解析的示例页面。</p>
<ul>
<li>项目1</li>
<li>项目2</li>
</ul>
</body>
</html>
"""
# 使用lxml的etree模块来解析HTML或XML字符串
# 注意:对于HTML内容,我们使用HTMLParser解析器
parser = etree.HTMLParser()
tree = etree.fromstring(html_content, parser=parser)
# 查找并打印<title>标签的文本
title = tree.find('.//title').text
print("页面标题:", title)
# 查找并打印class为"description"的<p>标签的文本
description = tree.find('.//p[@class="description"]').text
print("页面描述:", description)
# 查找所有的<li>标签,并打印它们的文本
for li in tree.findall('.//li'):
print("列表项:", li.text)
# 注意:lxml也支持XPath表达式来查找元素,这里只是简单展示了find和findall的用法
# XPath提供了更强大的查询能力
除了Python库之外,还有其他爬虫工具可以使用。
八爪鱼爬虫是一款功能强大的桌面端爬虫软件,主打可视化操作,即使是没有任何编程基础的用户也能轻松上手。
官网:1.软件分享[耶]八爪鱼,爬取了几百条网站上的公开数据,不用学代码真的很方便。[得意]2.发现了一个很棒的软件,?不用学python也可以爬数据!用它爬了n多数据。3.微博、电商、各大新闻平台的数据,很多可以用模版一键爬取数据,非常方便!4.做科研项目要采集很多数据,[耶]科研人的救命神器,推荐!5.实时获取楼市动态,用八爪鱼收集网上关于楼盘的用户评价,不用学代码直接爬了很多数据6.用八爪鱼实时爬取电商数据,追踪竞争对手价格,商品信息一手掌握[得意]7.用八爪鱼自动收集全网最新新闻,迅速获取热点资讯,超方便?
八爪鱼支持多种数据类型采集,包括文本、图片、表格等,并提供强大的自定义功能,能够满足不同用户需求。此外,八爪鱼爬虫支持将采集到的数据导出为多种格式,方便后续分析处理。
亮数据平台提供了强大的数据采集工具,比如Web Scraper IDE、亮数据浏览器、SERP API等,能够自动化地从网站上抓取所需数据,无需分析目标平台的接口,直接使用亮数据提供的方案即可安全稳定地获取数据。
网站:「链接」
亮数据浏览器支持对多个网页进行批量数据抓取,适用于需要JavaScript渲染的页面或需要进行网页交互的场景。
Web Scraper是一款轻便易用的浏览器扩展插件,用户无需安装额外的软件,即可在Chrome浏览器中进行爬虫。插件支持多种数据类型采集,并可将采集到的数据导出为多种格式。
无论是Python库还是爬虫软件,都能实现数据采集任务,可以选择适合自己的。当然记得在使用这些工具时,一定要遵守相关网站的爬虫政策和法律法规。
umbo 是 Google 的一款用C语言实现的HTML5解析库,无需任何外部依赖。
https://github.com/google/gumbo-parser
PDF文件现在在许多企业中常用 - 无论您是要生成销售报告,交付合同还是发送发票,PDF都是首选的文件类型。PDF.js是由Mozilla编写的JavaScript库。由于它使用vanilla JavaScript实现PDF渲染,因此它具有跨浏览器兼容性,并且不需要安装其他插件。在使用PDFJS之前你也可以先了解下原生的PDF<object>对象,本文仅介绍PDFJS。
https://mozilla.github.io/pdf.js/
官网提供了下载入口,有稳定版和Beta版,我们要在生产环境下使用建议使用稳定版,官网给我们提供了三种获取PDF.js的方式
我们可以直接使用cdn服务,也可以将下载的文件引入,我们看一下示例代码,这里我提供了两种写法,在项目运行之前,请确保你的同级目录下有一个test.pdf文件
//index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<script src="https://cdn.jsdelivr.net/npm/pdfjs-dist@2.0.943/build/pdf.min.js"></script>
<script src='./index.js'></script>
<title>PDF</title>
</head>
<body>
<canvas id="pdf"></canvas>
</body>
</html>
//index.js
// var loadingTask = pdfjsLib.getDocument("test.pdf");
// loadingTask.promise.then(
// function(pdf) {
// // 加载第一页
// pdf.getPage(1).then(function(page) {
// var scale = 1;
// var viewport = page.getViewport(scale);
// //应用到页面的canvas上.
// var canvas = document.getElementById("pdf");
// var context = canvas.getContext("2d");
// canvas.height = viewport.height;
// canvas.width = viewport.width;
// // 渲染canvas.
// var renderContext = {
// canvasContext: context,
// viewport: viewport
// };
// page.render(renderContext).then(function() {
// console.log("Page rendered!");
// });
// });
// },
// function(reason) {
// console.error(reason);
// }
// );
// index.js
(async () => {
const loadingTask = pdfjsLib.getDocument("test.pdf");
const pdf = await loadingTask.promise;
// 加载第一页.
const page = await pdf.getPage(1);
const scale = 1;
const viewport = page.getViewport(scale);
// 应用到页面的canvas上.
const canvas = document.getElementById("pdf");
const context = canvas.getContext("2d");
canvas.height = viewport.height;
canvas.width = viewport.width;
// 渲染canvas.
const renderContext = {
canvasContext: context,
viewport: viewport
};
await page.render(renderContext);
})();
当我们运行项目之后,打开浏览器查看,它已经将pdf的内容渲染到了浏览器中,且显示了第一页,如下图所示:
如果就这样的话远远是无法满足我们使用的,因此我们来看一下它比较高级的用法,或者说简单的用法,高级的功能。
首先我们将我们下载的js包加压,复制里面的web文件夹,粘贴到你的项目目录
然后修改你的index.html代码,首先注释掉之前引入的js代码,然后修改body,如下
<body> <iframe src="test.pdf" style="border: none;" width="100%" height='1000px'></iframe> </body>
随后打开我们的浏览器,你会发现一个预览的窗口
它继承了我们常用的功能,比如旋转、下载、打印、自适应缩放、放大、缩小等,我们只需要使用iframe引入我们的pdf文件即可,其余的全部交给pdf来完成,即可获得一个实现一个完整的pdf预览功能。
PDFJS的这三层分开,让我们很好的来根据业务需求来实现我们想要的部分,其简单的api让我们得心应手,总而言之,PDFJS是一个绝佳的PDF预览解决方案。
PDFJS不仅仅支持pdf的二进制文件,同样还支持base64编码的pdf,如果在你的项目中需要用到pdf的预览等功能,无疑它是一种良好的解决方案,当然想要实现相同的功能有许多办法,我们可以选择最适合我们需求的,官方还提供了一个完整的演示Demo,如下截图,如果你觉得本文对你有帮助,请麻烦转发、点赞加关注吧,后续会分享更多实用有趣的技术!
*请认真填写需求信息,我们会在24小时内与您取得联系。