Python 网络爬虫高阶用法

网络爬虫成为了自动化数据抓取的核心工具。Python 拥有强大的第三方库支持,在网络爬虫领域的应用尤为广泛。本文将深入探讨 Python 网络爬虫的高阶用法,包括处理反爬虫机制、动态网页抓取、分布式爬虫以及并发和异步爬虫等技术。以下内容结合最新技术发展,旨在帮助读者掌握高级 Python 爬虫技术。

目录

  1. 常用 Python 爬虫工具回顾
  2. 动态网页数据抓取
  3. 反爬虫机制与应对策略
  4. Scrapy 高级应用
  5. 分布式爬虫与异步爬虫
  6. 爬虫数据存储与处理
  7. 实战案例:电商商品数据抓取

1. 常用 Python 爬虫工具回顾

1.1 Requests 和 BeautifulSoup

RequestsBeautifulSoup 是 Python 中常用的组合,用于抓取和解析静态网页。Requests 处理 HTTP 请求,而 BeautifulSoup 则解析 HTML 内容。

import requests
from bs4 import BeautifulSoup# 发起 HTTP 请求
response = requests.get('https://example.com')
# 解析 HTML 内容
soup = BeautifulSoup(response.text, 'html.parser')# 提取特定元素
title = soup.find('title').text
print(title)
1.2 Scrapy

Scrapy 是一个功能强大的爬虫框架,适合大型项目和需要高效抓取的场景。Scrapy 提供了完善的爬虫流程,支持异步抓取、数据存储等功能。

# 爬虫示例代码,需在 Scrapy 项目中使用
import scrapyclass ExampleSpider(scrapy.Spider):name = 'example'start_urls = ['https://example.com']def parse(self, response):title = response.css('title::text').get()yield {'title': title}

2. 动态网页数据抓取

动态网页中的数据通常由 JavaScript 渲染,传统的爬虫工具无法直接获取。这时可以使用 SeleniumPyppeteer 等工具来抓取动态网页。

2.1 Selenium 动态抓取

Selenium 模拟浏览器行为,加载并渲染动态网页,适合处理复杂的交互页面。

from selenium import webdriver# 初始化 WebDriver
driver = webdriver.Chrome()# 打开动态网页
driver.get('https://example.com')# 等待页面完全加载
driver.implicitly_wait(5)# 获取网页源代码
html = driver.page_source# 关闭浏览器
driver.quit()
2.2 Pyppeteer 动态抓取

Pyppeteer 是 Puppeteer 的 Python 版本,使用无头浏览器抓取动态页面,适合需要高效抓取的场景。

import asyncio
from pyppeteer import launchasync def main():browser = await launch()page = await browser.newPage()await page.goto('https://example.com')content = await page.content()print(content)await browser.close()asyncio.get_event_loop().run_until_complete(main())

3. 反爬虫机制与应对策略

为了防止数据滥用,许多网站引入了反爬虫机制。常见的反爬虫手段包括 IP 封禁、请求频率限制、验证码等。为了应对这些机制,可以采取以下策略:

3.1 模拟用户行为

通过调整请求头信息和行为模式,可以模拟真实用户的操作,从而绕过反爬虫机制。

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('https://example.com', headers=headers)
3.2 使用代理池

使用代理 IP 来隐藏爬虫的真实 IP,避免被封禁。可以通过轮换多个代理来规避封锁。

proxies = {'http': 'http://10.10.1.10:3128','https': 'http://10.10.1.10:1080',
}response = requests.get('https://example.com', proxies=proxies)
3.3 Cookie 和 Session 处理

为了保持登录状态或模拟用户交互,爬虫需要处理 Cookie 和 Session。Requests 库提供了会话保持功能。

# 使用会话保持
session = requests.Session()# 设置初始的 cookie
session.cookies.set('name', 'value')# 发送带有 cookie 的请求
response = session.get('https://example.com')

4. Scrapy 高级应用

Scrapy 框架不仅支持基本的爬虫功能,还可以通过中间件、pipeline 等机制扩展功能。

4.1 数据存储与处理

Scrapy 提供了多种数据存储方式,支持将抓取到的数据直接保存到数据库或文件中。

# pipelines.py 示例
import pymongoclass MongoPipeline:def open_spider(self, spider):self.client = pymongo.MongoClient("mongodb://localhost:27017/")self.db = self.client["example_db"]def close_spider(self, spider):self.client.close()def process_item(self, item, spider):self.db.example_collection.insert_one(dict(item))return item
4.2 分布式爬虫

对于大型项目,分布式爬虫可以显著提升爬取速度和效率。Scrapy 可以结合 Redis 实现分布式爬取。

# 在 Scrapy 项目中使用 scrapy-redis 进行分布式爬虫
# 安装 scrapy-redis 并配置 settings.py
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"

5. 分布式爬虫与异步爬虫

为了提升抓取效率,分布式和异步爬虫是非常重要的技术。Python 提供了 asyncioaiohttp 等异步库,能够有效提高并发抓取能力。

5.1 asyncio 与 aiohttp

asyncioaiohttp 是 Python 的异步编程库,支持并发执行多个网络请求。

import asyncio
import aiohttpasync def fetch(session, url):async with session.get(url) as response:return await response.text()async def main():async with aiohttp.ClientSession() as session:html = await fetch(session, 'https://example.com')print(html)asyncio.run(main())
5.2 多线程与多进程

对于 CPU 密集型任务,可以使用 Python 的 concurrent.futures 库来实现多线程和多进程并发。

from concurrent.futures import ThreadPoolExecutordef fetch(url):response = requests.get(url)return response.textwith ThreadPoolExecutor(max_workers=5) as executor:results = executor.map(fetch, ['https://example.com'] * 5)for result in results:print(result)

6. 爬虫数据存储与处理

在爬虫抓取到大量数据后,需要有效地存储和处理。常见的存储方式包括数据库存储和文件存储。

6.1 数据库存储

可以将爬虫数据存储到关系型数据库(如 MySQL)或非关系型数据库(如 MongoDB)。

import pymysql# 连接 MySQL 数据库
connection = pymysql.connect(host='localhost',user='user',password='passwd',db='database')# 插入数据
with connection.cursor() as cursor:sql = "INSERT INTO `table` (`column1`, `column2`) VALUES (%s, %s)"cursor.execute(sql, ('value1', 'value2'))connection.commit()
6.2 文件存储

对于小规模的数据,可以直接将数据存储为 CSV 或 JSON 格式文件。

import csv# 写入 CSV 文件
with open('data.csv', mode='w') as file:writer = csv.writer(file)writer.writerow(['column1', 'column2'])writer.writerow(['value1', 'value2'])

7. 实战案例:电商网站商品数据抓取

在实际项目中,爬虫常用于抓取电商网站的商品信息。以下为一个简单的商品数据抓取流程:

  1. 使用 Requests 获取商品列表页面。
  2. 使用 BeautifulSoup 解析 HTML,提取商品信息。
  3. 将数据存储到 CSV 文件中。
import requests
from bs4 import BeautifulSoup
import csv# 发送 HTTP 请求
response = requests.get('https://example.com/products')# 解析 HTML 内容
soup = BeautifulSoup(response.text, 'html.parser')# 提取商品信息
products = soup.find_all('div', class_='product')# 写入 CSV 文件
with open('products.csv', mode='w') as file:writer = csv.writer(file)writer.writerow(['Product Name', 'Price'])for product in products:name = product.find('h2').textprice = product.find('span', class_='price').textwriter.writerow([name, price])

结语

通过学习本文的内容,读者应掌握 Python 网络爬虫的高级用法,并能够应对反爬虫机制、抓取动态网页、实现分布式和异步爬虫。网络爬虫技术在数据抓取、信息采集等方面有着广泛的应用,掌握这些技能将大大提升数据处理和分析的效率。

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

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

相关文章

docker+mysql创建用户名密码_docker里面的mysql 更换密码

进入mysql容器 操作vi etc/mysql/my.cnf 默认是不安装vi编辑器的,下面安装vi 更新安装包 apt-get update 安装vim 执行这条语句 apt-get install vim 到修改docker容器里面的mysql数据库密码了 启动mysql容器 docker exec -it mysql /bin/bash 编辑配置文件 我这里是…

TON(四)底层编译——PROGRAM{

系列文章目录 文章目录 系列文章目录前言一、PROCGRAM{ 是什么?二、详细分析PROCGRAM{1. 0 : main2. proclist null!variable ( – )hole ( – p)box (x – p)示例 3. proccnt 0!4. gvarcnt 0!5. { bl word newproc } : NEWPROCdeclproc 前言 这次我们将详细讲解PR…

Python 爬取天气预报并进行可视化分析

今天,我们就来学习如何使用 Python 爬取天气预报数据,并用数据可视化的方式将未来几天的天气信息一目了然地展示出来。 在本文中,我们将分三步完成这一任务: 使用 Python 爬取天气数据数据解析与处理用可视化展示天气趋势 让我…

【C++】第五节:内存管理

1、C/C内存分布 看下面一段代码 int globalVar 1; static int staticGlobalVar 1; void Test() {static int staticVar 1;int localVar 1;int num1[10] { 1, 2, 3, 4 };char char2[] "abcd";const char* pChar3 "abcd";int* ptr1 (int*)malloc(s…

在 Oracle 中利用 `ORA_HASH` 高效处理大规模数据:并行分片的最佳实践20241008

在 Oracle 中利用 ORA_HASH 高效处理大规模数据:并行分片的最佳实践 在数据处理规模越来越庞大的今天,如何高效地处理数百万甚至数千万条记录成为数据库性能优化的重要课题。面对这种挑战,单线程处理数据显然会成为瓶颈。通过使用多线程并行…

与C++内存管理和STL简介的爱恨情仇

本文 1.C/C内存分布2.C语言中动态内存管理方式:malloc/calloc/realloc/free总结 3.C内存管理方式new/delete操作内置类型new和delete操作自定义类型 4.operator new与operator delete函数(重要点进行讲解)5.new和delete的实现原理内置类型自定…

制造业DT数字化之生产制造业务建模

一、工厂建模为何物? 对制造业人员(人)、设备(机)、材料(料)、工艺流程(法)、工厂环境(环)数据化管理的过程就叫工厂建模。 二、制造建模有哪几大…

HTTP 和 WebSocket

目录 HTTP是什么HTTP局限性(HTTP1.1)请求和响应HTTP的主要特点:HTTP版本: HTTP与TCP关系数据封装传输过程1. **协议层次模型**:2. **封装过程**:1. **应用层(HTTP)**:2. …

【操作系统】引导(Boot)电脑的奇妙开机过程

🌹😊🌹博客主页:【Hello_shuoCSDN博客】 ✨操作系统详见 【操作系统专项】 ✨C语言知识详见:【C语言专项】 目录 什么是操作系统的引导? 操作系统的引导(开机过程) Windows操作系…

QD1-P2 HTML 编辑器:HBuilderX

本节学习: HTML课程内容介绍HBuilderX编辑器的使用 本节视频 www.bilibili.com/video/BV1n64y1U7oj?p2 HTML 内容 基础语法 标签整体架构DOCTYPE 常用标签 标题和水平线段落和换行列表div 和 span格式化标签图片超链接标签表格表单字符实体 编辑器 HBuilder…

设计测试用例的方法

目录 1、等价类 2、边界值 3、场景法 4、正交表法 5、设计正交表 6、判定表法 7、错误猜想法 1、等价类 在测试中选取一些数据作为等价类进行测试,如果测试通过,就代表测试通过,可以用少量代表性的测试数据取得较好的测试结果。 等价类…

Oracle EBS中 电子文档归档 模块的财务流程概览

Oracle E-Business Suite (EBS) 提供了电子文档归档(Electronic Document Archiving, EDA)功能,它是一个重要的组成部分,帮助组织有效地管理和存储大量的业务文档。虽然在提供的资料中没有直接提及电子文档归档模块的财务流程概览…

智能扭矩系统在轨道交通行业的应用_SunTorque

【大家好,我是唐Sun,唐Sun的唐,唐Sun的Sun。一站式数智工厂解决方案服务商】 在现代轨道交通领域,安全、高效和可靠性是至关重要的考量因素。智能扭矩系统作为一项先进的技术,正逐渐在轨道交通行业中展现出其重要的应用…

【原创】java+springboot+mysql劳动教育网系统设计与实现

个人主页:程序猿小小杨 个人简介:从事开发多年,Java、Php、Python、前端开发均有涉猎 博客内容:Java项目实战、项目演示、技术分享 文末有作者名片,希望和大家一起共同进步,你只管努力,剩下的交…

Vscode+Pycharm+Vue.js+WEUI+django火锅(四)WEUI和Vue整合

Vue移动端的UI库,其实网上推荐的排行榜上看起来都好,尤其是Vuetify 特别有眼缘,因为看到了三个字“易上手”。 但是因为之前系统的Django开发,便于企业微信中访问选用了WEUI,所以还是继续使用WEUI的方案。1.安装 PS C:\website\my…

使用Milvus和Llama-agents构建更强大的Agent系统

代理(Agent)系统能够帮助开发人员创建智能的自主系统,因此变得越来越流行。大语言模型(LLM)能够遵循各种指令,是管理 Agent 的理想选择,在许多场景中帮助我们尽可能减少人工干预、处理更多复杂任…

golang获取当天最小的时间,以DateTime的string格式返回

推荐学习文档 golang应用级os框架,欢迎stargolang应用级os框架使用案例,欢迎star案例:基于golang开发的一款超有个性的旅游计划app经历golang实战大纲golang优秀开发常用开源库汇总想学习更多golang知识,这里有免费的golang学习笔…

@RequestParam @PathVirable @RequestBody @ApiParam的区别

RequestParam 最常用用value指定参数名字,required字段指定参数是否必须,默认为true,当requiredfalse时,一般配合着defaultValue"xx"使用对应的url是这样的: https://localhost/requestParam/test?key1va…

通俗易懂的人工智能(AI)入门教程

欢迎来到人工智能(AI)的世界!无论您是对AI感到好奇,还是希望在未来的职业中应用AI技术,这篇教程将为您提供一个清晰的入门指南。我们将以简单易懂的方式,带您了解AI的基本概念、发展历程、主要分支及其应用…

C++与Java Web开发的对比分析:优势与差异

目录 1. 引言 2. C的开发优势与特点 2.1 高性能与硬件控制 2.2 面向对象与多范式支持 2.3 跨平台能力 3. Java Web的开发优势与特点 3.1 跨平台与广泛的企业应用 3.2 丰富的生态系统与工具支持 3.3 安全性与稳定性 4. C与Java Web的差异对比 4.1 性能与效率 4.2 开发…