通过与 Jira 对比,让您更全面了解 PingCode

  • 首页
  • 需求与产品管理
  • 项目管理
  • 测试与缺陷管理
  • 知识管理
  • 效能度量
        • 更多产品

          客户为中心的产品管理工具

          专业的软件研发项目管理工具

          简单易用的团队知识库管理

          可量化的研发效能度量工具

          测试用例维护与计划执行

          以团队为中心的协作沟通

          研发工作流自动化工具

          账号认证与安全管理工具

          Why PingCode
          为什么选择 PingCode ?

          6000+企业信赖之选,为研发团队降本增效

        • 行业解决方案
          先进制造(即将上线)
        • 解决方案1
        • 解决方案2
  • Jira替代方案

25人以下免费

目录

python爬取的内容如何存到mysql

python爬取的内容如何存到mysql

要将Python爬取的内容存储到MySQL数据库中,可以按照以下几个步骤进行:安装必要的库、建立数据库连接、创建表结构、爬取数据并插入到数据库中。 在这篇文章中,我将详细介绍如何实现这些步骤,并讨论一些常见的陷阱和最佳实践。

一、安装必要的库

在开始编写代码之前,需要安装一些必要的Python库。主要包括requests用于发起HTTP请求,BeautifulSoup用于解析HTML文档,以及pymysql用于与MySQL数据库进行交互。

pip install requests

pip install beautifulsoup4

pip install pymysql

这些库可以帮助你高效地爬取和存储数据。requests库非常强大且易于使用,它可以处理各种HTTP请求。而BeautifulSoup库是一个解析和提取HTML和XML数据的强大工具,适合于从网页中提取数据。pymysql是一个纯Python的MySQL客户端库,能够帮助你轻松连接和操作MySQL数据库。

二、建立数据库连接

在爬取数据之前,需要先建立与MySQL数据库的连接。下面的代码展示了如何使用pymysql库连接到MySQL数据库。

import pymysql.cursors

连接到数据库

connection = pymysql.connect(host='localhost',

user='your_username',

password='your_password',

database='your_database',

charset='utf8mb4',

cursorclass=pymysql.cursors.DictCursor)

try:

with connection.cursor() as cursor:

# 执行查询

sql = "SELECT VERSION()"

cursor.execute(sql)

result = cursor.fetchone()

print(f"Database version: {result['VERSION()']}")

finally:

connection.close()

在这个代码片段中,我们使用pymysql.connect函数来连接到MySQL数据库。需要注意的是,hostuserpassworddatabase参数需要根据实际情况进行修改。

三、创建表结构

为了存储爬取的数据,需要在MySQL数据库中创建一个表。以下是一个创建表的示例代码:

import pymysql.cursors

连接到数据库

connection = pymysql.connect(host='localhost',

user='your_username',

password='your_password',

database='your_database',

charset='utf8mb4',

cursorclass=pymysql.cursors.DictCursor)

try:

with connection.cursor() as cursor:

# 创建表

create_table_query = """

CREATE TABLE IF NOT EXISTS `web_data` (

`id` INT NOT NULL AUTO_INCREMENT,

`title` VARCHAR(255) NOT NULL,

`content` TEXT,

`url` VARCHAR(255) NOT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

"""

cursor.execute(create_table_query)

connection.commit()

finally:

connection.close()

这个代码片段创建了一个名为web_data的表,包含了idtitlecontenturl字段。id字段是主键,并且是自动递增的。titleurl字段是非空的,content字段是可选的。

四、爬取数据并插入到数据库中

接下来,我们需要编写代码来爬取数据,并将数据插入到MySQL数据库中。下面是一个示例代码:

import requests

from bs4 import BeautifulSoup

import pymysql.cursors

连接到数据库

connection = pymysql.connect(host='localhost',

user='your_username',

password='your_password',

database='your_database',

charset='utf8mb4',

cursorclass=pymysql.cursors.DictCursor)

def fetch_data(url):

response = requests.get(url)

if response.status_code == 200:

soup = BeautifulSoup(response.text, 'html.parser')

title = soup.title.string.strip()

content = soup.get_text().strip()

return title, content

else:

return None, None

def save_to_database(title, content, url):

try:

with connection.cursor() as cursor:

insert_query = """

INSERT INTO `web_data` (`title`, `content`, `url`)

VALUES (%s, %s, %s)

"""

cursor.execute(insert_query, (title, content, url))

connection.commit()

except Exception as e:

print(f"Error: {e}")

connection.rollback()

url_list = [

'http://example.com/page1',

'http://example.com/page2',

'http://example.com/page3',

]

for url in url_list:

title, content = fetch_data(url)

if title and content:

save_to_database(title, content, url)

connection.close()

在这个示例代码中,fetch_data函数用于发送HTTP请求并解析网页内容,save_to_database函数用于将爬取的数据插入到MySQL数据库中。我们使用了一个url_list来存储要爬取的网页URL,并循环遍历这些URL进行爬取和存储操作。

五、处理异常和优化代码

在实际应用中,爬取数据和存储数据可能会遇到各种异常情况,例如网络请求失败、数据库连接超时等。为了提高代码的健壮性,我们需要处理这些异常,并进行一些优化。

以下是一些处理异常和优化代码的建议:

  1. 使用重试机制:对于网络请求失败的情况,可以使用重试机制来增加成功率。可以使用requests库的Retry功能或者编写自定义的重试逻辑。

  2. 批量插入数据:如果要插入大量数据,可以使用批量插入的方式来提高效率。可以将多条数据保存在一个列表中,然后一次性插入到数据库中。

  3. 使用连接池:为了避免频繁建立和关闭数据库连接,可以使用连接池来管理数据库连接。可以使用pymysql库的连接池功能或者其他第三方库(如sqlalchemy)来实现。

  4. 日志记录:为了便于调试和监控,可以使用日志记录来记录爬取和存储过程中的重要信息和异常情况。可以使用Python的logging库来实现。

下面是一个优化后的示例代码:

import requests

from bs4 import BeautifulSoup

import pymysql.cursors

from requests.adapters import HTTPAdapter

from requests.packages.urllib3.util.retry import Retry

import logging

logging.basicConfig(level=logging.INFO)

连接到数据库

connection = pymysql.connect(host='localhost',

user='your_username',

password='your_password',

database='your_database',

charset='utf8mb4',

cursorclass=pymysql.cursors.DictCursor)

session = requests.Session()

retry = Retry(total=5, backoff_factor=1, status_forcelist=[500, 502, 503, 504])

adapter = HTTPAdapter(max_retries=retry)

session.mount('http://', adapter)

session.mount('https://', adapter)

def fetch_data(url):

try:

response = session.get(url, timeout=10)

response.raise_for_status()

soup = BeautifulSoup(response.text, 'html.parser')

title = soup.title.string.strip()

content = soup.get_text().strip()

return title, content

except requests.RequestException as e:

logging.error(f"Failed to fetch {url}: {e}")

return None, None

def save_to_database(data):

try:

with connection.cursor() as cursor:

insert_query = """

INSERT INTO `web_data` (`title`, `content`, `url`)

VALUES (%s, %s, %s)

"""

cursor.executemany(insert_query, data)

connection.commit()

except Exception as e:

logging.error(f"Error saving to database: {e}")

connection.rollback()

url_list = [

'http://example.com/page1',

'http://example.com/page2',

'http://example.com/page3',

]

data_to_save = []

for url in url_list:

title, content = fetch_data(url)

if title and content:

data_to_save.append((title, content, url))

if data_to_save:

save_to_database(data_to_save)

connection.close()

在这个优化后的示例代码中,我们使用了RetryHTTPAdapter来实现请求的重试机制,并使用logging库来记录日志信息。同时,我们将多条数据保存在data_to_save列表中,并使用cursor.executemany方法进行批量插入操作,从而提高了代码的性能和健壮性。

通过以上步骤,你可以轻松地将Python爬取的内容存储到MySQL数据库中。希望这篇文章对你有所帮助!

相关问答FAQs:

如何使用Python将爬取的数据存储到MySQL中?
要将爬取的数据存储到MySQL中,首先需要安装MySQL的Python连接库,如mysql-connector-pythonPyMySQL。接着,创建一个数据库和表以保存数据。在爬取数据后,使用Python的数据库连接库将数据插入到表中。代码示例通常包括连接数据库、准备SQL插入语句,以及执行插入操作。

在存储数据到MySQL时,如何处理数据的格式问题?
存储数据时需要确保数据格式与MySQL表中定义的字段类型相匹配。例如,日期和时间需要转换为DATETIME格式,字符串应确保不超过字段长度。使用Python的内置函数和库(如datetime)可以帮助进行格式转换,以避免因格式不匹配而导致的错误。

如何避免在将数据存储到MySQL时出现重复记录?
为了避免重复记录,可以在MySQL表中设置唯一约束(UNIQUE)或主键(PRIMARY KEY)。在插入数据之前,使用SELECT语句检查是否存在相同的记录。如果存在,可以选择更新现有记录或跳过插入操作。此外,使用INSERT IGNOREINSERT ON DUPLICATE KEY UPDATE语句也可以有效地处理重复记录问题。