Python 网络爬虫实战:从基础到高级爬取技术

📝个人主页🌹:一ge科研小菜鸡-CSDN博客
🌹🌹期待您的关注 🌹🌹

1. 引言

网络爬虫(Web Scraping)是一种自动化技术,利用程序从网页中提取数据,广泛应用于数据采集、搜索引擎、市场分析、舆情监测等领域。本教程将涵盖 requests、BeautifulSoup、Selenium、Scrapy 等常用工具,并深入探讨 反爬机制突破、动态加载页面、模拟登录、多线程/分布式爬取等高级技巧。


2. 爬虫基础:requests + BeautifulSoup

2.1 安装依赖

pip install requests beautifulsoup4 lxml

2.2 使用 requests 获取网页内容

import requestsurl = "https://news.ycombinator.com/"
headers = {"User-Agent": "Mozilla/5.0"}
response = requests.get(url, headers=headers)print(response.status_code)  # 返回 200 说明成功获取网页
print(response.text[:500])   # 预览部分 HTML 内容

2.3 使用 BeautifulSoup 解析 HTML

from bs4 import BeautifulSoupsoup = BeautifulSoup(response.text, "lxml")# 获取所有新闻标题
titles = soup.find_all("a", class_="titlelink")
for title in titles:print(title.text, title["href"])

3. 爬取动态页面:Selenium

3.1 安装 Selenium

pip install selenium webdriver-manager

并下载浏览器驱动(如 ChromeDriver)。

3.2 自动化浏览器

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager# 启动浏览器
options = webdriver.ChromeOptions()
options.add_argument("--headless")  # 无头模式
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=options)# 访问网页
driver.get("https://news.ycombinator.com/")
titles = driver.find_elements(By.CLASS_NAME, "titlelink")for title in titles:print(title.text, title.get_attribute("href"))driver.quit()

4. 模拟登录

许多网站需要用户登录后才能访问数据,例如 GitHub、微博等。

4.1 requests + Session 登录

login_url = "https://github.com/login"
session = requests.Session()# 获取登录页面
resp = session.get(login_url, headers=headers)
soup = BeautifulSoup(resp.text, "lxml")# 获取隐藏的 CSRF 令牌
auth_token = soup.find("input", {"name": "authenticity_token"})["value"]# 发送登录请求
login_data = {"login": "your_username","password": "your_password","authenticity_token": auth_token
}
session.post("https://github.com/session", data=login_data, headers=headers)# 爬取登录后的页面
profile_page = session.get("https://github.com/settings/profile")
print(profile_page.text)

5. 处理反爬机制

5.1 使用代理

proxies = {"http": "http://your_proxy:port","https": "https://your_proxy:port"
}
response = requests.get(url, headers=headers, proxies=proxies)

5.2 伪装请求头

headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/91.0.4472.124 Safari/537.36","Referer": "https://www.google.com","Accept-Language": "en-US,en;q=0.9"
}

5.3 随机休眠

import time
import randomtime.sleep(random.uniform(1, 5))  # 随机等待 1-5 秒

6. Scrapy 爬虫框架

6.1 安装 Scrapy

pip install scrapy

6.2 创建 Scrapy 爬虫

scrapy startproject myspider
cd myspider
scrapy genspider hackernews news.ycombinator.com

6.3 编写 Scrapy 爬虫

编辑 myspider/spiders/hackernews.py

import scrapyclass HackerNewsSpider(scrapy.Spider):name = "hackernews"start_urls = ["https://news.ycombinator.com/"]def parse(self, response):for item in response.css(".titlelink"):yield {"title": item.css("::text").get(),"link": item.css("::attr(href)").get()}

6.4 运行爬虫

scrapy crawl hackernews -o results.json

7. 爬虫性能优化

7.1 多线程爬取

import threadingdef fetch(url):response = requests.get(url, headers=headers)print(url, response.status_code)urls = ["https://example.com/page{}".format(i) for i in range(1, 11)]threads = [threading.Thread(target=fetch, args=(url,)) for url in urls]
for thread in threads:thread.start()
for thread in threads:thread.join()

7.2 分布式爬取(Scrapy + Redis)

pip install scrapy-redis

在 Scrapy settings.py 中:

SCHEDULER = "scrapy_redis.scheduler.Scheduler"
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
REDIS_URL = "redis://localhost:6379"

8. 结语

本教程系统地介绍了 Python 网络爬虫的各个关键环节,涵盖了从基础到高级的技术应用。首先,我们使用 requests + BeautifulSoup 进行基本的静态页面爬取,并掌握了 HTML 解析的核心方法。接着,我们通过 Selenium 处理动态加载的网页,了解了如何模拟浏览器操作,提高数据抓取的灵活性。在数据访问受限的情况下,我们学习了 模拟登录 技术,掌握了如何绕过身份验证,获取登录后才能访问的数据。

除此之外,为了应对网站的反爬机制,我们介绍了 代理 IP 轮换、User-Agent 伪装、请求头优化、随机休眠 等策略,以降低被封 IP 的风险。同时,我们还探讨了 Scrapy 框架的应用,包括爬取大型网站、数据管道管理,以及如何结合 Redis 进行分布式爬取,以提升数据采集的效率。

在实际应用中,网络爬虫广泛应用于搜索引擎、电子商务数据分析、舆情监测、金融风控、学术研究等领域。然而,我们在使用爬虫技术的同时,也需要关注数据合规性和法律风险,避免爬取受版权保护或敏感数据的网站,遵循网站的 robots.txt 规范,合理使用爬取工具,确保数据的合法合规性。

未来,随着反爬机制的不断升级,我们可能需要借助机器学习和深度学习技术来识别验证码、自动分析网页结构,提高爬取的智能化程度。同时,随着云计算和分布式技术的发展,大规模数据抓取将更加依赖分布式爬虫架构,如结合Kafka、Spark Streaming 等工具,实现高效、实时的数据采集和处理。

希望本教程能帮助你入门和深入理解 Python 爬虫技术,在实践中灵活运用各种工具,提高数据抓取的稳定性和效率。如果你对网络爬虫有更深入的需求,可以进一步学习图像识别验证码破解、基于 AI 的网页结构解析、深度强化学习爬虫策略优化等前沿技术,探索更多爬取的可能性!

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

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

相关文章

MySQL锁类型(详解)

锁的分类图,如下: 锁操作类型划分 读锁 : 也称为共享锁 、英文用S表示。针对同一份数据,多个事务的读操作可以同时进行而不会互相影响,相互不阻塞的。 写锁 : 也称为排他锁 、英文用X表示。当前写操作没有完成前,它会…

Java中的常见对象类型解析

在Java开发中,数据的组织和传递是一个重要的概念。为了确保代码的清晰性、可维护性和可扩展性,我们通常会根据不同的用途,设计和使用不同类型的对象。这些对象的作用各不相同,但它们共同为构建高效、模块化的软件架构提供支持。 …

93,【1】buuctf web [网鼎杯 2020 朱雀组]phpweb

进入靶场 页面一直在刷新 在 PHP 中,date() 函数是一个非常常用的处理日期和时间的函数,所以应该用到了 再看看警告的那句话 Warning: date(): It is not safe to rely on the systems timezone settings. You are *required* to use the date.timez…

怀旧经典:1200+款红白机游戏合集,Windows版一键畅玩

​沉浸在怀旧的海洋中,体验经典红白机游戏的魅力!我们为您精心准备了超过1200款经典游戏的合集,每一款都是时代的印记,每一场都是回忆的旅程。这个合集不仅包含了丰富的游戏资源,还内置了多个Windows版的NES模拟器&…

51单片机 01 LED

一、点亮一个LED 在STC-ISP中单片机型号选择 STC89C52RC/LE52RC;如果没有找到hex文件(在objects文件夹下),在keil中options for target-output- 勾选 create hex file。 如果要修改编程 :重新编译-下载/编程-单片机重…

C语言实现库函数strlen

size_t是 unsigned int fgets会读入\n&#xff0c;用strcspn函数除去 assert判读指针是否为空指针&#xff0c;使用前要引头文件<assert.h> #include <stdio.h> #include <assert.h> size_t mystrlen(const char* str) {assert(str);size_t count 0;while …

【Rust自学】19.2. 高级trait:关联类型、默认泛型参数和运算符重载、完全限定语法、supertrait和newtype

喜欢的话别忘了点赞、收藏加关注哦&#xff08;加关注即可阅读全文&#xff09;&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 19.2.1. 在trait定义中使用关联类型来指定占位类型 我们首先在第10章的10.3. trait Pt.1&a…

自动化测试框架搭建-封装requests-优化

目的 1、实际的使用场景&#xff0c;无法避免的需要区分GET、POST、PUT、PATCH、DELETE等不同的方式请求&#xff0c;以及不同请求的传参方式 2、python中requests中&#xff0c;session.request方法&#xff0c;GET请求&#xff0c;只支持params传递参数 session.request(me…

Elasticsearch:如何搜索含有复合词的语言

作者&#xff1a;来自 Elastic Peter Straer 复合词在文本分析和标记过程中给搜索引擎带来挑战&#xff0c;因为它们会掩盖词语成分之间的有意义的联系。连字分解器标记过滤器等工具可以通过解构复合词来帮助解决这些问题。 德语以其长复合词而闻名&#xff1a;Rindfleischetik…

41【语言的编码架构】

不同语言采用的编码架构不一样 火山采用&#xff1a;UTF-16 易语言采用&#xff1a;GBK php采用&#xff1a;UTF-8 这个编码架构指的就是文本所代表的字节集&#xff0c;比如易语言中“你好”表示的就是{196,227,186,195} 窗口程序集名保 留 保 留备 注窗口程序集_启动窗口 …

web-SQL注入-CTFHub

前言 在众多的CTF平台当中&#xff0c;作者认为CTFHub对于初学者来说&#xff0c;是入门平台的不二之选。CTFHub通过自己独特的技能树模块&#xff0c;可以帮助初学者来快速入门。具体请看官方介绍&#xff1a;CTFHub。 作者更新了CTFHub系列&#xff0c;希望小伙伴们多多支持…

WPS动画:使图形平移、围绕某个顶点旋转一定角度

1、平移 案例三角形如下图&#xff0c;需求&#xff1a;该三角形的A点平移至原点 &#xff08;1&#xff09;在预想动画结束的位置绘制出图形 &#xff08;2&#xff09;点击选中原始图像&#xff0c;插入/动画/绘制自定义路径/直线 &#xff08;3&#xff09;十字星绘制的直线…

xmind使用教程

xmind使用教程 前言xmind版本信息“xmind使用教程”的xmind思维导图 前言 首先xmind是什么&#xff1f;XMind 是一款思维导图和头脑风暴工具&#xff0c;用于帮助用户组织和可视化思维、创意和信息。它允许用户通过图形化的方式来创建、整理和分享思维导图&#xff0c;可以用于…

KNIME:开源 AI 数据科学

KNIME&#xff08;Konstanz Information Miner&#xff09;是一款开源且功能强大的数据科学平台&#xff0c;由德国康斯坦茨大学的软件工程师团队开发&#xff0c;自2004年推出以来&#xff0c;广泛应用于数据分析、数据挖掘、机器学习和可视化等领域。以下是对KNIME的深度介绍…

2025年01月27日Github流行趋势

项目名称&#xff1a;onlook项目地址url&#xff1a;https://github.com/onlook-dev/onlook项目语言&#xff1a;TypeScript历史star数&#xff1a;5340今日star数&#xff1a;211项目维护者&#xff1a;Kitenite, drfarrell, iNerdStack, abhiroopc84, apps/dependabot项目简介…

TCL C++开发面试题及参考答案

进程和线程的区别 进程和线程都是操作系统中重要的概念,它们在很多方面存在着明显的区别。 从概念上来说,进程是资源分配的基本单位,每个进程都有自己独立的地址空间、内存、文件描述符等资源。例如,当我们在计算机上同时运行多个应用程序,像浏览器、文本编辑器等,每个应…

深入探讨DICOM医学影像中的WADO服务及其具体实现

1. 引言 随着数字化医学影像技术的普及&#xff0c;如何高效、安全地存储、管理和共享医学影像数据成为医疗行业亟待解决的关键问题。DICOM&#xff08;Digital Imaging and Communications in Medicine&#xff09;作为国际公认的医学影像标准&#xff0c;在全球范围内广泛应…

本地部署DeepSeek-R1模型(新手保姆教程)

背景 最近deepseek太火了&#xff0c;无数的媒体都在报道&#xff0c;很多人争相着想本地部署试验一下。本文就简单教学一下&#xff0c;怎么本地部署。 首先大家要知道&#xff0c;使用deepseek有三种方式&#xff1a; 1.网页端或者是手机app直接使用 2.使用代码调用API …

VS Code 复制正确格式的文件路径/文件夹路径 (绝对路径,相对路径, 斜杠 /, 反斜杠\\ 等)

VS Code 搜索 : baincd.copy-path-unixstyle Github : https://github.com/baincd/vscode-copy-path-unixstyle 插件市场: https://marketplace.visualstudio.com/items?itemNamebaincd.copy-path-unixstyle 支持复制各种格式的路径 格式 GitBash /c/chris/project-name/sr…

每天学点小知识之设计模式的艺术-策略模式

行为型模式的名称、定义、学习难度和使用频率如下表所示&#xff1a; 1.如何理解模板方法模式 模板方法模式是结构最简单的行为型设计模式&#xff0c;在其结构中只存在父类与子类之间的继承关系。通过使用模板方法模式&#xff0c;可以将一些复杂流程的实现步骤封装在一系列基…