使用Python爬虫将获得的图片URL保存到远程数据库中
之前只是将python爬取的视频和图片保存到Windows的文件中,但是占用的内存比力大。于是想办法将数据放在数据库中,gpt告诉我可以只保存数据的URL地址而不用保存数据本身,我觉得挺好,于是开始行动。之前用Qt编写了一个图形化界面用来实现MySQL数据库的一些功能,因此这个原理对我来说也不算难。在python中下载对应的第三方库,包罗爬虫需要用的requests和bs4,以及数据库需要用的sqlalchemy和pymysql。(保举Linux体系,使用python特别方便,不需要配置这配置那的。)
pip install requests beautifulsoup4 sqlalchemy pymysql 爬虫的话还是那样子,第一步先获取网页的数据,简单的只需要配置一下请求头headers就行了 。我这里要爬取的网站是六图网,只需要首页的图片来测试一下我的代码。界说了get_page_contect(url)函数来返回网页内容,url为自界说变量,取以下网站为例。假如可以或许正常相应就直接将网页内容返回,否则将错误信息打印到屏幕上。 六图网-psd素材网_免费设计素材下载_正版高清图片下载库 (16pic.com)https://csdnimg.cn/release/blog_editor_html/release2.3.7/ckeditor/plugins/CsdnLink/icons/icon-default.png?t=O83Ahttps://www.16pic.com/
def get_page_content(url):
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'
}
try:
response = requests.get(url, headers=headers)
print(f"请求状态码: {response.status_code}")# 打印状态码
if response.status_code == 200:
return response.text
else:
print("无数据,状态码:", response.status_code)
except requests.RequestException as e:
print(f"请求出现异常: {e}") 之后先写一个打印数据的函数extract_images(html_content),这会提取上一个函数获得的网页内容里面的图片url地址并打印到屏幕上。我先试试能不能获得我想要的数据,不然就直接存进数据库里我不太放心。这里面的html_coontext就用上面那个函数正常返回的值就行了。到这里都还和平凡的爬虫一样,但是下一步就要开始用上创建数据库毗连的第三方库了。
def extract_images(html_content):
if html_content:
soup = BeautifulSoup(html_content, 'html.parser')
img_tags = soup.find_all('img')
for img in img_tags:
print(img.get('src'))# 打印图片的 URL 首先你需要一个可以毗连的数据库,我用的是远程Linux下的数据库,开通默认的3306端口和添加bind-address=0.0.0.0到配置文件下,以及数据库里设置好用户的权限就行。以下下令是让用户有权限举行远程毗连。Windows下的也差不多,不外当地的肯定更轻易一些 。
GRANT ALL PRIVILEGES ON *.* TO 'username'@'%' IDENTIFIED BY 'your_password'; 接着,我要测试能否通过第三方库正常毗连到我的数据库。这通常只需要 配置好用户名,主机名,数据库名就行。下面有些import出来的第三方库还没用上,不外我怕混淆,就把毗连数据库需要的第三方库都导出来了。这里我的用户名是first,主机名是114.169.5,数据库名也是first,暗码是lbhxks1(后面我会修改的)。
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.orm import declarative_base, sessionmaker
from sqlalchemy.exc import SQLAlchemyError
# 数据库连接字符串
DATABASE_URL = "mysql+pymysql://first:lbhxks1@114.132.169.5/first"
def connect():
try:
# 创建数据库引擎
engine = create_engine(DATABASE_URL)
# 测试链接
with engine.connect() as connection:
print("数据库连接成功")
except SQLAlchemyError as e:
print(f"数据库连接失败: {e}") 到这一步也就能确定命据库是否毗连上了,接下来就要访问数据库并将数据保存进去了。在前面我们已经可以或许提取出网页内容中的url地址数据并打印到屏幕上。我们接下来就要处置惩罚我们可以或许获得的数据,不外下面就不太好明白了,我尽量说得明白。 由于上面我已经将数据库部分所需要用的第三方库都导出来了,接下来的内容我就不再写这一部分。
Base是基类,Image是继续Base的自界说模子类,在调用Base类的函数Base.metadata.create_all(engine)时,它会主动寻找继续了Base的自界说类,并通过自界说类指定的内容创建表。以下的自界说类用来在你指定的数据库(由engine告诉函数是哪个数据库)中创建表,表名为__tablename__后面的值(留意这是双下划线),属性列则是接着的"id","name","url"这三个,用Column函数指定对应的数据类型,同时id指定为主键,假如导入的数据没有id,则会从1自增,我们只导入name和url地址,name是截取部分url地址获取的。
sessionmaker(bind=engine)函数用来创建与数据库的对话,只有对话打开的时候才能举行通信,关掉对话则不能举行通信。同样,与哪个数据库举行对话也是有engine来通报信息的。这里设置了engine为默认参数,后面要调用的是session=Session()了,留意体会这里的区别。
Base = declarative_base()
DATABASE_URL = "mysql+pymysql://username:password@hostname/dbname"
class Image(Base):
__tablename__ = 'images'
id = Column(Integer, primary_key=True)
name = Column(String(255))
url = Column(String(255))# 存储图片的 URL
# engine是用来获取并传递数据库信息的,告诉Base类使用的是哪个数据库
engine = create_engine(DATABASE_URL)
Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)
session = Session()# 创建数据库会话 做好前面所有的准备工作之后,我们就可以开始将url数据导入数据库中了。也就是写一个导入数据的函数,我这里命名的是save_image_to_db(img_url,session),这个img_url就是我们之前打印到屏幕上的url地址数据,session就是对话(与Session差别)。这里面需要使用自界说类,同时用session.ass(image)函数将这一行数据导入。
def save_image_to_db(img_url, session):
try:
#根据url生成name
img_name = img_url.split('/')[-1]
# 创建并添加到数据库会话
image = Image(name=img_name, url=img_url)
session.add(image)
session.commit()
print(f"已保存图片链接: {img_url}")
except Exception as e:
print(f"保存图片链接到数据库发生错误: {e}") 末了我们修改当初那个将url地址打印到屏幕上的函数,我们这回就不是将url地址打印出来了,而是将一个一个的url地址导入到数据库中,这里调用save_image_to(img_url,session)函数就行了。到这里就已经结束了,相信大家都已经学会了。
def extract_images(html_content):
if html_content:
soup = BeautifulSoup(html_content, 'html.parser')
img_tags = soup.find_all('img')
session = Session()# 创建数据库会话
for img in img_tags:
img_url = img.get('src')
if img_url:
save_image_to_db(img_url, session)
session.close()# 关闭会话
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]