Python 爬虫:从入门到精通有这一篇文章就够了

一、Python 爬虫简介
(一)什么是网络爬虫
网络爬虫是一种自动获取网页内容的程序或脚本。它可以模拟人类在浏览器中的操作,按照一定的规则遍历网页,提取我们感兴趣的数据,比如网页中的文本、图片、链接等信息。在大数据时代,爬虫技术广泛应用于搜索引擎索引构建、数据挖掘、信息收集等领域。
(二)Python 在爬虫领域的优势
Python 作为一门高级编程语言,拥有丰富的库和简洁的语法,使其成为编写爬虫程序的热门选择。其优势体现在以下几个方面:
丰富的库:有许多专门用于网络请求、数据解析和处理的库,如 requests、BeautifulSoup、Scrapy 等,大大降低了开发难度。
简洁的语法:Python 代码易读易写,能够快速实现爬虫的逻辑。
跨平台性:可以在不同的操作系统上运行,方便部署和使用。
二、Python 爬虫入门
(一)环境搭建
首先,确保你的系统已经安装了 Python。你可以从 Python 官方网站(https://www.python.org/)下载适合你操作系统的版本。
安装完成后,可以使用命令行(如 Windows 的 cmd 或 Linux 的终端)输入 python --version 来检查 Python 是否安装成功。
(二)第一个简单的爬虫:使用 requests 库获取网页内容
requests 库是 Python 中用于发送 HTTP 请求的常用库。以下是一个简单的示例,用于获取一个网页的 HTML 内容:

python
Copy
import requests

# 发送 GET 请求到指定的网址
url = "https://www.example.com"
response = requests.get(url)

# 检查请求是否成功(状态码为 200 表示成功)
if response.status_code == 200:
    print(response.text)
else:
    print(f"请求失败,状态码: {response.status_code}")

在这个示例中:
我们首先导入了 requests 库。
然后指定了要访问的网址(这里是 https://www.example.com,你可以替换成你想要爬取的网址)。
使用 requests.get() 方法发送 GET 请求,并将返回的响应存储在 response 对象中。
通过检查 response.status_code 的值来确定请求是否成功,如果是 200,则打印出网页的 HTML 内容。
(三)解析 HTML:使用 BeautifulSoup
获取到网页的 HTML 内容后,通常需要从中提取我们需要的数据。BeautifulSoup 是一个强大的 HTML 解析库。以下是一个示例,假设我们要从一个简单的 HTML 页面中提取所有的链接:

python
Copy
import requests
from bs4 import BeautifulSoup

url = "https://www.example.com"
response = requests.get(url)

if response.status_code == 200:
    soup = BeautifulSoup(response.text, 'html.parser')
    # 找到所有的 <a> 标签,<a> 标签通常包含链接
    links = soup.find_all('a')
    for link in links:
        print(link.get('href'))

在这个示例中:
我们在代码中添加了 from bs4 import BeautifulSoup 来导入 BeautifulSoup 库。
在获取到网页内容后,创建了一个 BeautifulSoup 对象,传入 response.text(网页的 HTML 文本)和解析器类型 html.parser。
使用 soup.find_all(‘a’) 方法找到所有的 标签,然后遍历这些标签,通过 link.get(‘href’) 获取每个链接的 href 属性值,即链接地址。
三、Python 爬虫进阶
(一)处理网页表单和登录
有些网站需要用户登录或者填写表单才能获取更多信息。我们可以使用 requests 库来模拟表单提交和登录操作。以下是一个模拟登录的示例(假设登录网址是 https://login.example.com,用户名和密码字段分别是 username 和 password):

python
Copy
import requests

login_url = "https://login.example.com"
data = {
    "username": "your_username",
    "password": "your_password"
}
# 发送 POST 请求进行登录
response = requests.post(login_url, data=data)

if response.status_code == 200:
    print("登录成功")
    # 在这里可以继续访问登录后的页面内容
else:
    print(f"登录失败,状态码: {response.status_code}")

在这个示例中:
我们定义了登录网址 login_url 和包含用户名和密码的字典 data。
使用 requests.post() 方法发送 POST 请求,将数据作为参数传递给服务器,模拟表单提交的登录过程。
(二)设置请求头和代理
请求头(Headers):为了更像真实用户的请求,我们可以设置请求头。请求头包含了关于请求的额外信息,如用户代理(User - Agent)、接受的内容类型等。例如:

python
Copy
import requests

url = "https://www.example.com"
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}
response = requests.get(url, headers=headers)

if response.status_code == 200:
    print(response.text)

在这个示例中,我们设置了 User - Agent 请求头,使其看起来像是从 Chrome 浏览器发出的请求。
代理(Proxy):有时候我们需要使用代理服务器来隐藏我们的真实 IP 地址或者绕过一些访问限制。以下是使用代理的示例:

python
Copy
import requests

proxy = {
    'http': 'http://proxy_ip:proxy_port',
    'https': 'https://proxy_ip:proxy_port'
}
url = "https://www.example.com"
response = requests.get(url, proxies=proxy)

if response.status_code == 200:
    print(response.text)

这里我们定义了一个代理服务器的地址和端口,通过将其传递给 requests.get() 方法的 proxies 参数来使用代理。
(三)处理动态网页:使用 Selenium
有些网页是通过 JavaScript 动态加载内容的,对于这种情况,requests 和 BeautifulSoup 可能无法获取到完整的信息。Selenium 是一个用于自动化浏览器操作的工具,它可以与浏览器(如 Chrome、Firefox 等)交互,获取动态加载后的网页内容。
以下是一个使用 Selenium 与 Chrome 浏览器驱动(需要先安装 Chrome 浏览器和相应的 ChromeDriver,可从 https://sites.google.com/a/chromium.org/chromedriver/downloads 下载)来获取动态网页内容的示例:

python
Copy
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

# 设置 Chrome 选项,可用于无头模式等
chrome_options = Options()
# 例如,以下是设置无头模式(无浏览器界面运行)
# chrome_options.add_argument('--headless')

# 创建 Chrome 浏览器驱动对象
driver = webdriver.Chrome(options=chrome_options)

url = "https://www.example.com/dynamic_page"
driver.get(url)

# 在这里可以使用 driver 来查找和操作页面元素,例如获取页面标题
print(driver.title)

# 关闭浏览器驱动
driver.quit()

在这个示例中:
我们首先从 selenium 库中导入了 webdriver 和 Options。
创建了 ChromeOptions 对象,可以在其中设置一些 Chrome 浏览器的运行选项,如无头模式(–headless),这样在运行爬虫时不会弹出浏览器窗口。
使用 webdriver.Chrome() 方法创建了一个 Chrome 浏览器驱动对象,并传入设置好的选项。
使用 driver.get() 方法打开指定的网址,然后可以通过 driver 对象的各种方法来操作页面,如获取页面标题(driver.title)。
最后使用 driver.quit() 方法关闭浏览器驱动。
四、Python 爬虫高级技巧和注意事项
(一)多线程和多进程
为了提高爬虫的效率,可以使用多线程或多进程技术。在 Python 中,可以使用 threading 模块实现多线程,multiprocessing 模块实现多进程。以下是一个简单的多线程示例,用于同时爬取多个网页:

python
Copy
import requests
import threading

def crawl(url):
    response = requests.get(url)
    if response.status_code == 200:
        print(f"成功获取 {url} 的内容")

urls = ["https://www.example1.com", "https://www.example2.com", "https://www.example3.com"]
threads = []
for url in urls:
    t = threading.Thread(target=crawl, args=(url,))
    t.start()
    threads.append(t)

for t in threads:
t.join()

在这个示例中:
我们定义了一个 crawl() 函数,用于发送 GET 请求获取指定网址的内容。
创建了一个包含多个网址的列表 urls。
对于每个网址,创建一个新的线程,将 crawl 函数作为目标,并传入网址作为参数,然后启动线程。
使用 t.join() 方法等待所有线程完成。
多进程的实现方式类似,但需要注意进程间的数据共享和通信问题。
(二)数据存储
爬取到的数据需要进行存储。常见的存储方式有:
文件存储:可以将数据存储为文本文件、CSV 文件、JSON 文件等。例如,将获取到的网页标题存储为文本文件:

python
Copy
import requests
from bs4 import BeautifulSoup

url = "https://www.example.com"
response = requests.get(url)

if response.status_code == 200:
    soup = BeautifulSoup(response.text, 'html.parser')
    title = soup.title.string
    with open('titles.txt', 'w') as f:
        f.write(title)

数据库存储:对于大量的数据,可以使用数据库,如 MySQL、MongoDB 等。以 MySQL 为例,首先需要安装 mysql - connector - python 库,然后可以使用以下代码将数据插入到数据库中:

python
Copy
import mysql.connector
import requests
from bs4 import BeautifulSoup

# 连接到 MySQL 数据库
mydb = mysql.connector.connect(
    host="localhost",
    user="your_user",
    password="your_password",
    database="your_database"
)

mycursor = mydb.cursor()

url = "https://www.example.com"
response = requests.get(url)

if response.status_code == 200:
    soup = BeautifulSoup(response.text, 'html.parser')
    title = soup.title.string
    sql = "INSERT INTO web_pages (title) VALUES (%s)"
    val = (title,)
    mycursor.execute(sql, val)
    mydb.commit()

mycursor.close()
mydb.close()

在这个示例中:
我们使用 mysql.connector.connect() 方法连接到本地的 MySQL 数据库,需要提供主机地址、用户名、密码和数据库名称。
创建了一个游标对象 mycursor。
在获取到网页标题后,定义了一个 SQL 插入语句和要插入的值,然后使用游标执行插入操作,并通过 mydb.commit() 提交更改。
最后关闭游标和数据库连接。
(三)遵守网站的规则和法律法规
在编写爬虫程序时,一定要遵守目标网站的 robots.txt 文件规定,这是网站所有者告知网络爬虫哪些页面可以抓取、哪些不可以的文件。同时,要注意不要过度频繁地请求网站,以免对网站服务器造成负担。此外,要确保爬虫行为符合法律法规,不要侵犯他人的知识产权和隐私。
五、总结
通过以上内容,我们从 Python 爬虫的基础概念开始,逐步深入到高级技巧,涵盖了从简单的网页内容获取到处理复杂的动态网页、多线程和多进程优化以及数据存储等方面。希望这篇文章能帮助你全面掌握 Python 爬虫技术,在合法合规的前提下,利用爬虫为你的数据获取和分析需求服务。在实际应用中,还需要不断实践和探索,以应对各种不同的网页结构和应用场景。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Spring 配置绑定原理分析

Spring 配置绑定原理分析 前言 Spring 应用中存在诸多配置&#xff0c;有的是系统配置&#xff0c;有的命令行启动参数配置&#xff0c;有的是yaml配置&#xff0c;有的是分布式配置中心配置&#xff0c;但对使用者而言总是可以通过ConfigurationProperties将它关联到一个Java…

爬虫下载网页文夹

爬虫下载网页pdf文件 import os import requests from bs4 import BeautifulSoup from urllib.parse import urljoin from urllib.parse import urljoin, unquote from tqdm import tqdm # 设置网页的URL base_url "http://119/download/dzz/pdf/"# 创建保存文件的…

数据结构-归并排序笔记

【数据结构】八大排序(超详解附动图源码)_数据结构排序-CSDN博客 看这个学思路 一 归并排序介绍: 归并排序(MERGE-SORT)是利用归并的思想实现的排序方法&#xff0c;该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解&#xf…

编译器优化乌龙——记一次死循环不进入问题

记一次死循环不生效问题 看如下代码&#xff0c;本意是我们模拟一次死循环&#xff0c;然后会在中断处理函数中更改waiting的值&#xff0c;更改waiting的值后&#xff0c;跳出死循环。 int waiting 0; while(waiting0){}运行起来发现&#xff0c;程序根本就没有进入这个死循…

构建第一个ArkTs应用

1、新建第一个页面文件。在“Project”窗口&#xff0c;点击“entry > src > main > ets > pages”&#xff0c;打开“Index.ets”文件&#xff0c;进行页面的编写。 2、新建第二个页面文件。在“Project”窗口&#xff0c;打开“entry > src > main > e…

一文搞懂Linux kernel编译步骤

一、前言 什么是Linux的内核编译呢&#xff1f;简单来说&#xff0c;Linux内核编译是一个将内核源代码转换成可在特定的硬件架构上运行的二进制文件的过程。通过编译内核&#xff0c;我们可以根据自己的需求和兴趣对内核进行定制和优化&#xff0c;以满足特定的应用场景。下文…

IDEA构建JavaWeb项目,并通过Tomcat成功运行

目录 一、Tomcat简介 二、Tomcat安装步骤 1.选择分支下载 2.点击下载zip安装包 3.解压到没有中文、空格和特殊字符的目录下 4.双击bin目录下的startup.bat脚本启动Tomcat 5.浏览器访问Tomcat 6.关闭Tomcat服务器 三、Tomcat目录介绍 四、WEB项目的标准结构 五、WEB…

消息通知——公众号、小程序、短信对比

消息通知——公众号、小程序、短信对比 引言 在数字化时代&#xff0c;高效、准确的消息通知对于提升用户体验、增强用户粘性至关重要。本报告将深入分析三种常见的消息通知方式&#xff1a;微信公众号推送、微信小程序推送以及手机短信推送&#xff0c;从实现方式、优缺点及细…

三维测量与建模笔记 - 3.2 直接线性变换法标定DLT

DLT - Direct Linear Transform 上图中&#xff0c;透视成像对应的公式是共线方程&#xff0c;可以参考以下链接&#xff1a; https://zhuanlan.zhihu.com/p/101549821https://zhuanlan.zhihu.com/p/101549821 对于标定来说&#xff0c;需要找到。已知量是。 (u,v)是…

消息队列面试——打破沙锅问到底

消息队列的面试连环炮 前言 你用过消息队列么&#xff1f;说说你们项目里是怎么用消息队列的&#xff1f; 我们有一个订单系统&#xff0c;订单系统会每次下一个新订单的时候&#xff0c;就会发送一条消息到ActiveMQ里面去&#xff0c;后台有一个库存系统&#xff0c;负责获取…

【论文复现】KAN卷积:医学图像分割新前沿

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀知识图谱推理 1. 概述2. 核心创新点3. 模块介绍KANUNext模块 4. 本文主要结构5. 主要代码6. 数据集7. 结果展示8. 参考文献 前言&#xff1a;…

Oracle与SQL Server的语法区别

1&#xff09;日期和日期转换函数。 SQL: SELECT A.*, CASE WHEN NVL(PAA009,) OR PAA009 >Convert(Varchar(10), SYSDATE,120) THEN Y ELSE N END AS ActiveUser FROM POWPAA A WHERE PAA001admin or PAA002admin Oracle: SELECT A.*, CASE WHEN NVL(PAA009,) or PAA009&…

基于TRIZ理论的便携式光伏手机充电装置创新

随着智能手机功能的日益强大&#xff0c;电量消耗问题也日益凸显&#xff0c;尤其是在户外活动时&#xff0c;电量告急常常让人措手不及。面对这一挑战&#xff0c;基于TRIZ&#xff08;发明问题解决理论&#xff09;的创新思维&#xff0c;一款全新的便携式光伏手机充电装置应…

Vue3父传子

1. App.vue - 父组件 咱们先来看左边的 App.vue&#xff0c;它扮演的是“父亲”角色——你可以想象它是一位热心的老爸&#xff0c;手里拿着一条消息&#xff0c;正准备把这条消息送到“儿子”那里。 <script setup> // 这个 setup 就像一个神奇的开关&#xff0c;一开…

前端 算法 双指针

文章目录 三数之和移动零盛最多水的容器接雨水 三数之和 leetcode 三数之和 题目链接 给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请你返回所有…

EPSON机械手与第三方相机的校准功能设计By python

EPSON机械手与第三方相机的校准功能设计By python 使用Python来实现EPSON机械手与第三方相机的校准功能是一个复杂但可行的任务。这通常涉及以下几个步骤:硬件接口通信、图像处理、标定算法实现和控制逻辑编写。 1. 环境准备 首先,库 pip install numpy opencv-python pyse…

NPU 可不可以代替 GPU

结论 先说结论&#xff0c;GPU分为可以做图形处理的传统意义上的真GPU&#xff0c;做HPC计算的GPGPU和做AI加速计算的GPGPU&#xff0c;所以下面分别说&#xff1a; 对于做图形处理的GPU&#xff0c;这个就和NPU 一样&#xff0c;属于DSA&#xff0c;没有替代性。当然&#xf…

python画图|hist()函数画直方图进阶

【1】引言 前序已经学习了hist()函数画直方图的基础教程&#xff0c;相关文章见下述链接&#xff1a; python画图|hist()函数画直方图初探-CSDN博客 在这里我们初步认识了hist()函数&#xff0c;并使用该函数画出了8个直方图。 之后又用bar(&#xff09;函数进行对比&#…

推荐一款非常好用的C/C++在线编译器

C/C作为一门底层、高效的编程语言&#xff0c;广泛应用于系统开发、游戏引擎、嵌入式系统等领域。然而&#xff0c;C/C的开发环境配置会让开发者把部分时间消耗在这件事上&#xff0c;也经常会遇到各种各样的环境问题。 本地开发的痛点 环境配置复杂&#xff1a;C/C的开发环境…

kafka如何获取 topic 主题的列表?

大家好&#xff0c;我是锋哥。今天分享关于【kafka如何获取 topic 主题的列表&#xff1f;】面试题&#xff1f;希望对大家有帮助&#xff1b; kafka如何获取 topic 主题的列表&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在Kafka中&#xff0c;可以…