使用Python爬虫将获得的图片URL保存到远程数据库中

打印 上一主题 下一主题

主题 810|帖子 810|积分 2430

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


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

光之使者

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表