首页 > 编程语言 >Python爬虫进阶技巧

Python爬虫进阶技巧

时间:2024-08-20 19:25:17浏览次数:11  
标签:进阶 Python 爬虫 example url https import response

在掌握了基本的网页数据提取与解析技能后,我们将进一步探讨Python爬虫的进阶技巧,以应对更加复杂的网络环境和数据抓取需求。

  1. 动态网页爬取

动态网页是指那些通过JavaScript动态生成内容的网页。这类网页的内容在初次加载时并不包含在HTML源代码中,因此无法直接使用传统的爬虫方法进行数据提取。

(1)JavaScript渲染的页面

对于JavaScript渲染的页面,我们需要模拟浏览器的行为,执行JavaScript代码,从而获取渲染后的页面内容。

  1. Selenium库的使用

Selenium是一个自动化测试工具,它支持多种浏览器,可以模拟用户的浏览器操作,适用于爬取动态网页。

(2)实例:使用Selenium爬取动态网页

以下是一个使用Selenium爬取动态网页的详细步骤:

首先,安装Selenium库和对应的WebDriver:

bash

复制

pip install selenium

然后,下载对应浏览器的WebDriver,例如ChromeDriver,并将其放置在系统的PATH路径下。

接下来,编写Python代码:

python

复制

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from webdriver_manager.chrome import ChromeDriverManager

# 设置Chrome选项,以无头模式运行
options = Options()
options.headless = True
options.add_argument("--window-size=1920,1080")

# 初始化WebDriver
service = Service(ChromeDriverManager().install())
driver = webdriver.Chrome(service=service, options=options)

# 打开目标网页
driver.get('https://www.example.com')

# 等待页面加载,可以使用显式等待或隐式等待
driver.implicitly_wait(10)

# 执行JavaScript代码或查找元素
# 例如,获取页面标题
title = driver.find_element(By.TAG_NAME, 'title').text

# 打印标题
print(f'Page Title: {title}')

# 执行其他操作,如滚动页面、点击按钮等
# ...

# 关闭浏览器
driver.quit()
  1. 代理与反爬虫策略

爬虫在长时间运行时可能会遇到IP被封禁的问题,此时可以使用代理来绕过IP限制。

(3)常见反爬虫手段

  • User-Agent限制:限制某些User-Agent的访问。
  • IP限制:限制同一IP的访问频率或直接封禁。
  • 验证码:要求用户输入验证码以区分人与机器。
  • 动态页面:通过JavaScript动态生成内容。

(4)代理的基本原理

代理服务器充当客户端和目标服务器之间的中介,通过转发请求和响应来隐藏客户端的真实IP地址。

(5)实例:使用代理爬取网站

以下是一个使用代理爬取网站的示例:

python

复制

import requests

# 定义代理服务器
proxies = {
    'http': 'http://your_proxy_server:port',
    'https': 'http://your_proxy_server:port',
}

# 使用代理进行网络请求
response = requests.get('https://www.example.com', proxies=proxies)

# 检查响应
if response.status_code == 200:
    print(response.text)
else:
    print(f'Failed to retrieve data: {response.status_code}')
  1. 数据存储

爬虫抓取到的数据需要存储下来,以便后续的分析和处理。

(6)文本存储(如JSON、CSV)

JSON和CSV是两种常见的数据存储格式,它们易于读写且格式清晰。

python

复制

import json
import csv

# 存储为JSON
data = {'name': 'Alice', 'age': 25}
with open('data.json', 'w') as f:
    json.dump(data, f)

# 存储为CSV
data_list = [{'name': 'Alice', 'age': 25}, {'name': 'Bob', 'age': 30}]
with open('data.csv', 'w', newline='') as f:
    writer = csv.DictWriter(f, fieldnames=['name', 'age'])
    writer.writeheader()
    writer.writerows(data_list)

(7)数据库存储(如MySQL、MongoDB)

数据库提供了更强大的数据存储和管理能力,适合大规模数据。

python

复制

import pymysql

# 连接MySQL数据库
conn = pymysql.connect(host='localhost', user='root', password='123456', db='mydb', charset='utf8mb4')
cursor = conn.cursor()

# 插入数据
sql = "INSERT INTO users (name, age) VALUES (%s, %s)"
cursor.execute(sql, ('Alice', 25))

# 提交事务
conn.commit()

# 关闭游标和连接
cursor.close()
conn.close()
  1. 多线程与异步爬虫

多线程和异步编程可以显著提高爬虫的效率。

(8)线程与进程的基本概念

线程是操作系统能够

进行运算调度的最小单位,它是进程中的实际运作单位。进程则是计算机中的程序关于某数据集合的一次运行活动,是系统进行资源分配和调度的基本单位。

(9)threading库的使用

Python的threading库允许我们创建、启动、同步多个线程,从而实现并发执行。

以下是一个使用threading库实现多线程爬虫的示例:

python

复制

import threading
import requests
from queue import Queue

# 定义爬虫任务函数
def crawl(url):
    response = requests.get(url)
    print(f"URL: {url}, Status Code: {response.status_code}")

# 线程工作函数
def worker(queue):
    while True:
        url = queue.get()
        crawl(url)
        queue.task_done()

# 创建任务队列
queue = Queue()

# 创建并启动线程
for i in range(5):  # 假设我们创建5个工作线程
    t = threading.Thread(target=worker, args=(queue,))
    t.daemon = True  # 设置为守护线程
    t.start()

# 添加URL到队列
urls = ['https://www.example.com/page1', 'https://www.example.com/page2', ...]
for url in urls:
    queue.put(url)

# 等待队列清空
queue.join()

(10)asyncio库的使用

asyncio是Python用于编写单线程并发代码的库,使用async/await语法。以下是一个使用asyncioaiohttp实现异步爬虫的示例:

python

复制

import asyncio
import aiohttp

async def fetch(session, url):
    async with session.get(url) as response:
        return await response.text()

async def main():
    async with aiohttp.ClientSession() as session:
        urls = ['https://www.example.com/page1', 'https://www.example.com/page2', ...]
        tasks = [fetch(session, url) for url in urls]
        responses = await asyncio.gather(*tasks)
        for response in responses:
            print(response)

# 运行异步主函数
asyncio.run(main())
  1. 多进程爬虫

除了多线程,Python的multiprocessing库还可以用于创建多进程,这在CPU密集型任务中尤其有用。

(11)进程的基本概念

进程是系统进行资源分配和调度的基本单位,每个进程都有自己独立的内存空间。

以下是一个使用multiprocessing库实现多进程爬虫的示例:

python

复制

from multiprocessing import Pool, cpu_count
import requests

# 定义爬虫任务函数
def crawl(url):
    response = requests.get(url)
    print(f"URL: {url}, Status Code: {response.status_code}")

# URL列表
urls = ['https://www.example.com/page1', 'https://www.example.com/page2', ...]

# 创建进程池
with Pool(processes=cpu_count()) as pool:
    # 使用进程池执行爬虫任务
    pool.map(crawl, urls)

通过上述内容,我们详细介绍了Python爬虫的进阶技巧,包括动态网页爬取、代理与反爬虫策略、数据存储以及多线程与异步爬虫。这些技巧将帮助您在复杂的网络环境中更有效地进行数据抓取。在实际应用中,您可能需要根据具体场景和需求,灵活组合使用这些技巧,以达到最佳的爬取效果。希望本文能够成为您Python爬虫学习之旅上的重要参考资料。

标签:进阶,Python,爬虫,example,url,https,import,response
From: https://blog.csdn.net/sdsdsdd__/article/details/141366377

相关文章

  • py2puml 是一个用于将 Python 代码转换为 PlantUML 图的工具,python代码生成py2puml案
    py2puml 是一个用于将Python代码转换为PlantUML图的工具,但它可能不是广泛认知或广泛使用的库,因为存在多个类似名称的工具和库,且它们的功能和用法可能有所不同。不过,基于你的需求,我将提供一个假设性的例子,说明如何使用一个假想的 py2puml 库来生成Python代码的UML图。......
  • Python连接MySQL数据库
    连接Mysql数据库#!/usr/bin/envpython#-*-coding:utf-8-*-importMySQLdb#连接数据库db=MySQLdb.connect(host="localhost",user="zabbix",passwd="123123",db="zabbix")#创建cursor对象cursor=db.cursor()#执行SQL查询cu......
  • Python、R用RFM模型、机器学习对在线教育用户行为可视化分析|附数据、代码
    全文链接:https://tecdat.cn/?p=37409原文出处:拓端数据部落公众号分析师:ChunniWu随着互联网的不断发展,各领域公司都在拓展互联网获客渠道,为新型互联网产品吸引新鲜活跃用户,刺激用户提高购买力,从而进一步促进企业提升综合实力和品牌影响力。然而,为了更好地了解产品的主要受众群......
  • python异步
    fastapi是一个异步的web框架。Starlette是一个轻量级、快速的PythonASGI框架,专为构建高性能异步Web应用和微服务而设计。它是FastAPI的核心依赖之一,许多FastAPI的功能都基于Starlette提供的组件。Starlette以其简洁的设计和丰富的功能而著称,非常适合构建现代异步W......
  • 基于python+flask框架的家政服务网上预约与管理系统(开题+程序+论文) 计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景在快节奏的现代生活中,家政服务成为了许多家庭不可或缺的一部分,它极大地便利了人们的日常生活,提高了生活质量。然而,传统的家政服务预约方式......
  • 基于python+flask框架的智能旅游线路规划系统设计与实现(开题+程序+论文) 计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着旅游业的蓬勃发展和科技的日新月异,人们对旅游体验的需求日益多元化与个性化。传统的旅游线路规划往往依赖于旅行社的固定套餐或个人的......
  • python ssh上传文件到linux并解压
    importparamikoimportosdefupload_and_unzip(local_file,remote_file,zip_dir):#创建SSH客户端ssh=paramiko.SSHClient()ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())private_key_path=r'F:\mysite.pem'#加载私钥文件......
  • Python面试中常见的知识点和问题
    Python面试中常见的知识点和问题,供你参考: ###基础知识1.**数据类型**:  -基本类型:int,float,str,bool  -容器类型:list,tuple,set,dict 2.**控制结构**:  -条件语句:if,elif,else  -循环语句:for,while 3.**函数**:  -定义函数:def......
  • 使用python-slim镜像遇到无法使用PostgreSQL的问题
    前言之前不是把DjangoStarter的docker方案重新搞好了吗一开始demo部署是使用SQLite数据库的,用着没问题,但很快切换到PostgreSQL的时候就遇到问题了…报错docker启动之后,app容器报错django.core.exceptions.ImproperlyConfigured:Errorloadingpsycopg2orpsycopg......
  • Python学习日记(Page.3)
    今日整理方便日后回顾。如有错误欢迎指正。  今天总结一下字符串扩展的内容。第一部分字符串的三种定义方式 单引号name='黑马'   2.双引号name="黑马"   3.三引号name="""黑马"""注:单引号可包含双引号,但不能包含单引号双引号可包含单......