赞
踩
【吐血整理】Python爬虫实战!从入门到放弃,手把手教你数据抓取秘籍
网络爬虫,又称为网页蜘蛛或爬虫,是一种用来自动浏览万维网的程序。它按照一定的算法顺序抓取网页内容,同时将抓取到的数据存储起来,用于进一步的分析和处理。
数据抓取是数据分析的第一步,它涉及到从结构化或非结构化的数据源中提取有用信息。
例如,一个电商平台可能使用网络爬虫抓取竞争对手的产品信息,然后通过数据分析预测市场趋势,制定相应的营销策略。在项目操作中,数据抓取可以按照以下步骤进行:
以下是一个简单的Python网络爬虫示例,用于抓取某个博客网站上的所有文章标题:
import requests from bs4 import BeautifulSoup # 目标网页URL url = 'https://blog.csdn.net/eclipsercp/article/details/140220092' # 发送HTTP请求 response = requests.get(url) response.encoding = 'utf-8' # 解析网页内容 soup = BeautifulSoup(response.text, 'html.parser') # 查找所有文章标题并打印 for title in soup.find_all('h1'): print(title.get_text())
在实际项目中,需要根据具体需求调整爬虫的逻辑和存储方案。同时,要注意网站的反爬措施和法律风险,确保数据抓取的合法性。
Python作为一门高级编程语言,在网络爬虫的开发中展现出了其独特的优势:
例如,使用requests库发送HTTP请求获取网页内容,再利用BeautifulSoup进行HTML文档的解析,可以快速提取出所需的数据:
import requests
from bs4 import BeautifulSoup
url = 'http://example.com'
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')
# 假设我们要提取所有的段落文本
paragraphs = soup.find_all('p')
for p in paragraphs:
print(p.text)
在开发和部署网络爬虫时,必须考虑到法律和道德方面的问题:
例如,在使用Scrapy框架编写爬虫时,可以在settings中设置延迟(DOWNLOAD_DELAY)以减少对目标网站的请求压力:
# settings.py
DOWNLOAD_DELAY = 1.0 # 设置下载延迟为1秒
同时,可以在爬虫代码中添加对robots.txt的遵守:
from scrapy import Spider
class MySpider(Spider):
name = 'my_spider'
start_urls = ['http://example.com']
def parse(self, response):
# 检查是否允许爬取当前页面
if response.url in response.meta['robotstxt']['disallow']:
return
# 进行数据抽取...
通过这些措施,可以确保爬虫的行为既合法又符合道德标准。
Beautiful Soup是一个用于解析HTML和XML文档的Python库。它能够从网页中提取数据,非常适合用于编写网络爬虫。以下是使用Beautiful Soup进行网页数据抓取的基本步骤:
安装Beautiful Soup库:
首先,需要安装Beautiful Soup库,可以通过pip安装:
pip install beautifulsoup4
请求网页:
使用requests
库来获取网页内容:
import requests
url = 'http://example.com'
response = requests.get(url)
html = response.text
解析网页:
使用Beautiful Soup解析获取到的HTML:
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'html.parser')
提取数据:
通过标签、类名或ID等选择器提取需要的数据:
# 通过标签名提取
titles = soup.find_all('h1')
# 通过类名提取
items = soup.find_all(class_='item-class')
处理数据:
遍历提取的数据,进行进一步的处理:
for title in titles:
print(title.get_text())
异常处理:
在爬虫中加入异常处理,确保程序的健壮性:
try:
response = requests.get(url)
response.raise_for_status()
except requests.exceptions.HTTPError as e:
print(f'HTTP error: {e}')
except requests.exceptions.RequestException as e:
print(f'Request error: {e}')
Scrapy是一个快速的、高层次的web抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。以下是使用Scrapy框架进行高级数据抓取的步骤:
创建Scrapy项目:
使用Scrapy命令行工具创建一个新的Scrapy项目:
scrapy startproject myproject
定义Item:
在items.py
文件中定义需要抓取的数据结构:
import scrapy
class MyItem(scrapy.Item):
title = scrapy.Field()
link = scrapy.Field()
编写Spider:
创建一个Spider来定义爬取的逻辑:
import scrapy
class MySpider(scrapy.Spider):
name = 'my_spider'
start_urls = ['http://example.com']
def parse(self, response):
for item in response.css('div.item'):
yield {
'title': item.css('h3::text').get(),
'link': item.css('a::attr(href)').get(),
}
中间件处理:
使用Scrapy的中间件机制处理请求和响应:
class MyMiddleware:
def process_request(self, request, spider):
# 对请求进行处理
pass
def process_response(self, request, response, spider):
# 对响应进行处理
return response
设置并发请求:
通过设置并发请求的数量来提高爬虫的效率:
# 在settings.py中设置
# 并发请求的数量
CONCURRENT_REQUESTS = 32
使用管道:
编写管道代码来处理Spider返回的Item,并将其存储到文件或数据库:
class MyPipeline:
def process_item(self, item, spider):
# 处理item,例如保存到数据库
return item
异常监控:
监控爬虫运行过程中的异常,确保爬虫的稳定运行:
from scrapy.exceptions import DropItem
class MySpider(scrapy.Spider):
# ...
def parse(self, response):
try:
# 解析逻辑
pass
except Exception as e:
spider.logger.error(f'Error processing {response.url}', exc_info=True)
return DropItem(f'Error processing {response.url}')
通过上述两个子课题的详细讲解和实例,读者应该能够对如何在项目中使用Beautiful Soup和Scrapy框架进行网络爬虫和数据抓取有了更深入的理解。
数据清洗是数据抓取后不可或缺的步骤,其目的是确保数据的质量和一致性。在网络爬虫获取数据后,原始数据可能包含错误、重复、不完整或不一致的信息。进行数据清洗可以提高数据的准确性和可靠性,从而为后续的数据分析和处理打下坚实的基础。
Pandas是一个强大的Python数据分析库,广泛应用于数据清洗和处理。以下是Pandas在数据抓取后处理流程中的应用示例:
read_csv
或read_sql
等函数读取不同格式的数据源。import pandas as pd
# 读取CSV文件
df = pd.read_csv('data.csv')
# 读取数据库
df = pd.read_sql('SELECT * FROM data', con=connection)
# 过滤出年龄大于30的记录
filtered_df = df[df['age'] > 30]
dropna
或fillna
函数处理缺失值。# 删除含有缺失值的行
cleaned_df = df.dropna()
# 填充缺失值
df_filled = df.fillna(value=0)
apply
或map
函数转换数据格式。# 转换日期格式
df['date'] = pd.to_datetime(df['date'], format='%Y-%m-%d')
# 将文本转换为小写
df['text'] = df['text'].apply(lambda x: x.lower())
merge
或concat
函数合并多个数据集。# 合并两个DataFrame
merged_df = pd.merge(df1, df2, on='key')
groupby
和agg
函数进行数据分组和聚合操作。# 按列分组并计算平均值
grouped_df = df.groupby('category')['value'].mean()
# 绘制直方图
df['value'].hist()
# 使用Matplotlib绘制散点图
import matplotlib.pyplot as plt
df.plot.scatter(x='feature1', y='feature2')
plt.show()
通过这些步骤,Pandas库能够有效地帮助用户处理和分析抓取后的数据,为进一步的数据分析和决策提供支持。
在本节中,我们将通过一个具体的股票数据抓取项目,来展示Python在网络爬虫和数据抓取中的应用。本项目的目标是从金融新闻网站抓取股票价格和相关新闻,并存储到本地数据库中。
首先,确保Python环境已经搭建好,推荐使用Python 3.8或以上版本。接下来,安装所需的库:
pip install requests beautifulsoup4 pandas sqlalchemy
使用浏览器的开发者工具分析目标网站的网页结构,找到股票数据和新闻所在的HTML元素。
import requests from bs4 import BeautifulSoup def fetch_stock_data(url): response = requests.get(url) soup = BeautifulSoup(response.text, 'html.parser') # 假设股票数据在<table>标签中,且有class名'stock-table' stock_table = soup.find('table', class_='stock-table') stocks = [] for row in stock_table.find_all('tr'): cells = row.find_all('td') stock = { 'code': cells[0].text, 'name': cells[1].text, 'price': cells[2].text, 'change': cells[3].text } stocks.append(stock) return stocks # 测试爬虫 url = 'http://finance.example.com/stock-market' stock_data = fetch_stock_data(url) print(stock_data)
使用SQLite数据库存储数据。
from sqlalchemy import create_engine, Column, String, Float, Integer, Date engine = create_engine('sqlite:///stocks.db') Stock = declarative_base() class StockData(Stock): __tablename__ = 'stock_data' id = Column(Integer, primary_key=True) code = Column(String) name = Column(String) price = Column(Float) change = Column(String) date = Column(Date, default=datetime.date.today) # 创建数据库表 Base.metadata.create_all(engine)
import pandas as pd
# 将股票数据转换为DataFrame
df = pd.DataFrame(stock_data)
# 插入数据库
df.to_sql('stock_data', con=engine, if_exists='append', index=False)
使用Linux系统的cron作业来定期运行爬虫脚本。
确保遵守目标网站的Robots协议,合法合规地进行数据抓取。
使用Pandas进行数据清洗:
# 读取数据库中的数据
df = pd.read_sql_table('stock_data', con=engine)
# 检查数据完整性
print(df.info())
# 处理缺失值
df = df.dropna()
# 格式统一
df['price'] = df['price'].astype(float)
进行描述性统计和趋势分析。
使用matplotlib绘制股票价格的时间序列图:
import matplotlib.pyplot as plt
# 假设df已经包含了时间序列数据
df.set_index('date', inplace=True)
df['price'].plot()
plt.title('Stock Price Over Time')
plt.xlabel('Date')
plt.ylabel('Price')
plt.show()
根据分析结果,提供投资建议。
使用Plotly创建交互式图表,并整合到Web应用中。
通过上述实战案例分析,读者可以了解到Python在网络爬虫和数据抓取中的应用,并掌握如何在实际项目中进行操作。
在开发网络爬虫时,经常需要应对目标网站的反爬虫策略。以下是一些常见的反爬虫措施及相应的应对方法:
import requests
from random_user_agent.user_agent import UserAgent
# 创建UserAgent对象
ua = UserAgent()
# 使用代理和User-Agent发送请求
proxies = {
'http': 'http://1.2.3.4:8080',
'https': 'https://1.2.3.4:8080'
}
headers = {'User-Agent': ua.random}
response = requests.get('http://example.com', headers=headers, proxies=proxies)
# 随机选择User-Agent
user_agents = [
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3",
# 更多User-Agent字符串...
]
headers = {'User-Agent': random.choice(user_agents)}
from pytesseract import image_to_string
from PIL import Image
# 假设captcha.png是验证码图片
captcha_image = Image.open('captcha.png')
text = image_to_string(captcha_image)
print('Recognized captcha:', text)
from selenium import webdriver
# 设置Selenium使用Chrome浏览器
driver = webdriver.Chrome()
driver.get('https://example.com/dynamic-content')
# 获取渲染后的页面源码
html_source = driver.page_source
print(html_source)
driver.quit()
import time
import random
# 设置请求间隔
base_interval = 60 # 每分钟
random_interval = random.uniform(0.8, 1.2) * base_interval
time.sleep(random_interval)
分布式爬虫可以提高数据抓取的效率和稳定性。以下是构建分布式爬虫的关键点:
import pika
# 连接到RabbitMQ服务器
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()
# 声明一个任务队列
channel.queue_declare(queue='task_queue')
# 发送任务到队列
channel.basic_publish(exchange='',
routing_key='task_queue',
body='http://example.com')
from pymongo import MongoClient
# 连接到MongoDB
client = MongoClient('mongodb://localhost:27017/')
db = client['crawler_db']
collection = db['data']
# 存储数据
data = {'url': 'http://example.com', 'content': 'some_content'}
collection.insert_one(data)
import requests
def fetch_url(url):
try:
response = requests.get(url)
response.raise_for_status() # 检查请求是否成功
return response.text
except requests.RequestException as e:
print(f"Error fetching {url}: {e}")
# 可以在这里实现重试逻辑
通过上述高级技术和策略,可以有效地应对网络爬虫开发中的挑战,并构建高效稳定的分布式爬虫系统。
Matplotlib是Python中一个非常基础且功能强大的数据可视化库,它能够创建各种静态、动态、交互式的图表。以下是一些使用Matplotlib进行图表绘制的技巧:
基本图表绘制:使用pyplot
模块可以绘制基本的线图、散点图、柱状图等。
import matplotlib.pyplot as plt
# 线图示例
plt.plot([1, 2, 3, 4], [1, 4, 9, 16])
plt.title('Line Plot Example')
plt.xlabel('x label')
plt.ylabel('y label')
plt.show()
多图组合:使用subplot
可以在同一张图上绘制多个图表,便于比较。
# 绘制两个子图
plt.subplot(2, 1, 1) # 第一个图
plt.plot([1, 2, 3], [1, 4, 9])
plt.subplot(2, 1, 2) # 第二个图
plt.bar([1, 2, 3], [1, 2, 3])
plt.show()
自定义图表样式:Matplotlib允许用户自定义图表的几乎每一个方面,包括颜色、线型、标记等。
plt.plot([1, 2, 3, 4], [1, 4, 9, 16], 'bo-') # 'b'代表蓝色,'o'代表圆圈标记,'-'代表线型
保存图表:使用savefig
函数可以将图表保存为多种格式。
plt.plot([1, 2, 3], [1, 2, 3])
plt.savefig('my_figure.png') # 保存为PNG格式
Seaborn是基于Matplotlib的高级接口,它提供了一系列高级接口来绘制有吸引力和有信息量的统计图形。以下是Seaborn库的一些应用示例:
分布图:Seaborn的distplot
可以用来显示数据的分布情况。
import seaborn as sns
import numpy as np
data = np.random.normal(size=100)
sns.distplot(data, kde=True)
箱型图:箱型图是展示数据分布和异常值的有力工具。
# 箱型图示例
sns.boxplot(x='day', y='total_bill', data=tips)
热力图:热力图可以展示变量间的相关性。
# 相关性热力图
sns.heatmap(data.corr(), annot=True)
分类数据的可视化:Seaborn提供了多种方法来可视化分类数据,如catplot
。
# 分类数据的箱型图
sns.catplot(x='day', y='total_bill', kind='box', data=tips)
主题和样式:Seaborn允许用户设置不同的主题和样式,以符合图表的展示需求。
sns.set(style="whitegrid", palette="pastel")
通过结合Matplotlib和Seaborn库,用户可以创建出既美观又具有信息量的数据可视化图表,从而更有效地传达数据背后的故事。
本文深入探讨了Python在网络爬虫和数据抓取中的应用,通过具体案例和代码示例,向读者展示了如何利用Python进行高效的网络数据采集。从基础的请求发送到复杂的数据解析,再到数据存储和进一步的处理,本文提供了一套完整的操作流程和技巧,旨在帮助读者快速掌握网络爬虫的开发技能。
为了进一步提升网络爬虫的开发能力,以下是一些推荐的进阶学习资源:
重点学习内容:
示例:
复制import scrapy
class MySpider(scrapy.Spider):
name = 'my_spider'
start_urls = ['http://example.com']
def parse(self, response):
# 解析响应数据
for href in response.css('a::attr(href)').getall():
yield {"url": href}
重点学习内容:
示例:
复制from bs4 import BeautifulSoup
import requests
response = requests.get('http://example.com')
soup = BeautifulSoup(response.text, 'html.parser')
# 提取所有的链接
for link in soup.find_all('a'):
print(link.get('href'))
重点学习内容:
示例:
复制from selenium import webdriver
driver = webdriver.Chrome()
driver.get('http://example.com')
# 定位元素并点击
element = driver.find_element_by_id('some-id')
element.click()
driver.quit()
重点学习内容:
示例:
复制import pandas as pd
# 读取CSV文件
df = pd.read_csv('data.csv')
# 数据清洗:去除空值
df.dropna(inplace=True)
# 统计分析:计算均值
mean_value = df['column_name'].mean()
print(mean_value)
通过本文的学习,希望你能对Python在网络爬虫和数据抓取中的应用有更深入的理解,并在实际项目中运用所学知识,不断探索和进步。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。