如何用Python+BeautifulSoup将每个链接单独存入数据库
问题:如何将每个抓取到的链接单独存入数据库?
你当前的代码会把所有抓取到的链接累积起来存入同一行,原因是每次循环都将之前所有链接拼接成一个字符串插入数据库,而不是单独插入每个链接。
错误原因分析
- 循环内每次将新链接加入
links列表,再用'"'.join(links)把所有链接拼成一个整体字符串,导致每次插入的都是截至当前的所有链接集合,而非单个独立链接。 - 游标
mycursor在循环内重复创建,属于不必要的性能损耗。
修正后的代码
from bs4 import BeautifulSoup from urllib.request import Request, urlopen import mysql.connector # 建立数据库连接 mydb = mysql.connector.connect( host="localhost", user="root", password="", database="webscraper" ) mycursor = mydb.cursor() # 提前初始化游标,避免循环内重复创建 req = Request("https://google.com") html_page = urlopen(req) main_link = "https://google.com" soup = BeautifulSoup(html_page, "html.parser") # 遍历每个a标签,单独插入链接 for link in soup.findAll('a'): current_link = link.get('href') # 跳过空链接,避免存入无效数据 if current_link: sql = "INSERT INTO links (main_link, link_scraped) VALUES (%s, %s)" val = (main_link, current_link) mycursor.execute(sql, val) mydb.commit() # 循环结束后统一提交,提升性能
关键修改点
- 直接使用
link.get('href')获取当前单个链接,不再拼接所有链接。 - 将游标初始化移到循环外,减少资源消耗。
- 添加空链接判断,避免存入无效数据。
- 将
commit()移到循环外,批量提交操作,提升数据库写入性能(如果需要实时提交也可以放回循环内,但批量提交更高效)。
内容的提问来源于stack exchange,提问作者hylkest
相关产品推荐
相关产品推荐

