找回密码
  注册[Register]
查看: 971|回复: 7

[其他] 爬取TTB网站美图

  [复制链接]
发表于 2019-12-26 21:38 | 显示全部楼层 |阅读模式
禁止求评分、诱导评分、互刷评分、互刷悬赏值,违规者封号处理。
禁止发布推广、邀请码、邀请链接、二维码或者有利益相关的任何推广行为。
所有非原创软件请发布在【精品软件区】,发帖必须按照本版块版规格式发帖。

初学Python3,看到一个美图网站,顺手写了一个脚本,自动爬取网站套图存取MySQL数据库中。
准备工作:
1、MySQL建表,共计3个:存套图集信息、存套图集下的套图信息、存套图下的图片信息
第一个表:ttb_atlas
IDint主键,自增
AtlasNamevarchar套图集名称
AtlasUrlvarchar套图集链接地址

第二个表:ttb_album
IDint主键,自增
AtlasNamevarchar套图集名称
AlbumNamevarchar套图名称
AlbumUrlvarchar套图链接地址
AlbumPicUrlvarchar套图预览照片链接
AlbumPicDatedate套图日期

第三个表:ttb_photo
IDint主键,自增
AlbumNamevarchar套图名称
PhotoNamevarchar图片名称
PhotoUrlvarchar图片链接地址

2、创建主函数程序ttb_lk.py


  1. #!/usr/local/Cellar/python/3.7.1/bin
  2. # -*- coding: UTF-8 -*-
  3. import sys
  4. sys.path.append("/Python")
  5. import conf.ttb_manage as myconf
  6. import conf.mysql_db as mysqldb

  7. home_url = 'https://www.192td.com'
  8. def main():
  9.     #第一步:将首页套图集索引插入数据库
  10.     myconf.get_home_atlas(home_url)

  11.     #第二步:获取每个套图集的每套图信息,包括:套图名称、套图链接、套图页数
  12.     db = mysqldb.Database()
  13.     sql = 'select * from ttb_atlas'
  14.     results = db.fetch_all(sql)
  15.     for row in results:
  16.         myconf.get_atlas_album(row['AtlasName'], row['AtlasUrl'])
  17.         print(row)
  18.     db.close()

  19.     #第三步:获取每套图的图片信息,包括:图片名称、图片链接
  20.     db = mysqldb.Database()
  21.     sql = 'select * from ttb_album'
  22.     results = db.fetch_all(sql)
  23.     for row in results:
  24. myconf.get_album_photo(row['AlbumName'], row['AlbumUrl'])
  25.     db.close()

  26. if __name__ == '__main__':
  27.     main()
复制代码
3、创建程序ttb_manage.py
  1. #!/usr/local/Cellar/python/3.7.1/bin
  2. # -*- coding: UTF-8 -*-
  3. import sys,requests,re,time,threading
  4. from bs4 import BeautifulSoup
  5. sys.path.append("/Python")
  6. import conf.mysql_db as mysqldb

  7. #======================================================
  8. #获取首页套图集信息
  9. def get_home_atlas(home_url):
  10.     # html = open("ttb.html", "r").read()
  11.     html = get_html(home_url)
  12.     soup = BeautifulSoup(html, "lxml")
  13.     db = mysqldb.Database()
  14.     try:
  15.         for ul in soup.find_all(class_ = 'childnav'):
  16.             for li in ul:
  17. sql = "insert into ttb_atlas(AtlasName,AtlasUrl) values('%s','%s')"%(li.string,li.a['href'])
  18.                 db.execute(sql)
  19. except Exception:
  20.         print(Exception)
  21.     db.close()
  22.     return True

  23. #获取套图集下的套图信息:1
  24. def get_atlas_album(AtlasName,AtlasUrl):
  25.     # 第一步:获取套图的信息:套图页数、每页套图链接
  26.     html = get_html(AtlasUrl)
  27.     soup = BeautifulSoup(html, "lxml")
  28.     #获取套图集页数
  29.     link = soup.find('a',string='尾页').get('href')
  30.     pages = int(re.findall('_(\d+).html',link,re.S)[0])
  31.     #获取套图集每页的链接
  32.     for page in range(pages,0,-1):
  33.         if page == 1 :
  34.             Page_Url = AtlasUrl
  35.             print(AtlasName + ' URL:' + Page_Url)
  36.             get_atlas_album_html(AtlasName,AtlasUrl,Page_Url)
  37.         else:
  38.             Page_Url = AtlasUrl +'index_' + str(page) + '.html'
  39.             print(AtlasName + ' URL:' + Page_Url)
  40.             get_atlas_album_html(AtlasName,AtlasUrl,Page_Url)
  41.         time.sleep(1)
  42.     return True

  43. #获取套图集下的套图信息:2
  44. def get_atlas_album_html(AtlasName,AtlasUrl,Page_Url):
  45.     # 第二步:获取每页套图集信息:套图名称、套图链接、封面图片
  46.     html = get_html(Page_Url)
  47.     soup = BeautifulSoup(html, "lxml")
  48.     db = mysqldb.Database()
  49.     for ul in soup.find(class_='clearfix'):
  50.         try:
  51.             AlbumUrl = AtlasUrl + re.findall('\/(\w+.html)',ul.a['href'],re.S)[0]
  52. AlbumPicDate = ul.b.string
  53.             AlbumName = ul.span.string
  54.             AlbumPicUrl = ul.img['lazysrc']
  55.             sql = "insert into ttb_album(AtlasName,AlbumName,AlbumUrl,AlbumPicUrl,AlbumPicDate) values('%s','%s','%s','%s','%s')"%(AtlasName,AlbumName,AlbumUrl,AlbumPicUrl,AlbumPicDate)
  56.             db.execute(sql)
  57. print(AlbumName + ' URL:' + AlbumUrl + '   插入成功!')
  58. except Exception:
  59.             print(Exception)
  60.     db.close()
  61.     return True

  62. #获取套图下的每套图片信息
  63. def get_album_photo(AlbumName,AlbumUrl):
  64. html = fread('ttb.html')
  65.     soup = BeautifulSoup(html, "lxml")

  66.     #获取第一页的图片信息与套图页数,将第一页信息插入数据库
  67.     PhotoName = soup.img['alt']
  68.     PhotoUrl = soup.img['lazysrc']
  69.     PhtoNum = soup.find('span', id='allnum').get_text()

  70.     db = mysqldb.Database()
  71.     sql = "insert into ttb_photo(AlbumName,PhotoName,PhotoUrl) values('%s','%s','%s')" % (AlbumName, PhotoName, PhotoUrl)
  72.     db.execute(sql)
  73.     print("第1张:" + PhotoName + '  URL:' +PhotoUrl)
  74.     db.close()
  75.     # 获取后面页数的图片信息,插入数据库
  76.     for i in range(2, int(PhtoNum) + 1):
  77.         url = AlbumUrl[:-5] + "_" + format(i) + ".html"
  78.         th = threading.Thread(target=get_img_insert, args=(i,AlbumName,url))
  79.         # ts.append(th)
  80.         th.start()
  81.         time.sleep(0.5)
  82.     return True

  83. #插入图片信息
  84. def get_img_insert(i,AlbumName,url):
  85.     html = get_html(url)
  86.     # html = fread('ttb.html')
  87.     soup = BeautifulSoup(html, "lxml")
  88.     PhotoName = soup.img['alt']
  89.     PhotoUrl = soup.img['lazysrc']
  90.     db = mysqldb.Database()
  91.     print("第"+ format(i) +"张:" + PhotoName + '  URL:' +PhotoUrl)
  92.     sql = "insert into ttb_photo(AlbumName,PhotoName,PhotoUrl) values('%s','%s','%s')"%(AlbumName,PhotoName,PhotoUrl)
  93.     db.execute(sql)
  94.     db.close()
  95.     return


  96. #======================================================
  97. #获取网页信息,得到的html就是网页的源代码,传url,返回html
  98. def get_html(url):
  99.     headers = {
  100.         'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
  101.         'Accept - Encoding': 'gzip, deflate, br',
  102.         'Accept-Language': 'zh-CN,zh;q=0.9',
  103.         'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36',
  104.     }
  105.     resp = requests.get(url,headers=headers)
  106.     resp.encoding='utf-8'
  107.     html = resp.text
  108. return html
复制代码
4、创建程序mysql_db.py(注意修改mysql连接的参数)


  1. #!/usr/local/Cellar/python/3.7.1/bin
  2. # -*- coding: UTF-8 -*-
  3. import mysql.connector
  4. import logging

  5. # 加入日志
  6. # 获取logger实例
  7. logger = logging.getLogger("dbSql")
  8. # 指定输出格式
  9. formatter = logging.Formatter('%(asctime)s%(levelname)-8s:%(message)s')

  10. #数据库操作类
  11. class Database:
  12.     # 构造函数
  13.     def __init__(self):
  14.         self._dbhost = 'localhost'  # 数据库主机地址
  15.         self._dbuser = 'root'       # 数据库用户名
  16.         self._dbpassword = 'root'   # 数据库密码
  17.         self._dbname = 'lk'         # 数据库名称
  18.         self._dbcharset = 'utf8'    # 数据库编码
  19.         self._conn = self.connectMysql()
  20.         if (self._conn):
  21.             self._cursor = self._conn.cursor()

  22.     # 数据库连接
  23.     def connectMysql(self):
  24.         conn =False
  25.         try:
  26.             # self._conn = mysql.connector.connect(
  27.             conn = mysql.connector.connect(
  28.                         host=self._dbhost,
  29.                         user=self._dbuser,
  30.                         passwd=self._dbpassword,
  31.                         database=self._dbname,
  32.                         charset=self._dbcharset,
  33.                         )
  34.         except Exception:
  35.             # self._logger.error("connect database failed, %s" % data)
  36.             logger.error("connect database failed!")
  37.             conn =False
  38.         # self._cursor = self._conn.cursor()
  39.         return conn

  40.     # 直接执行SQL语句
  41.     def execute(self, sql):
  42.         flag = False
  43.         if (self._conn):
  44.             try:
  45.                 self._cursor.execute(sql)
  46.                 self._conn.commit()
  47.                 flag = True
  48.             except Exception:
  49.                 flag = False
  50.                 logger.warning("update database exception SQL=" + sql)
  51.         return flag


  52.     # 查询所有数据,带字段名
  53.     def fetch_all(self, sql):
  54.         result = ''
  55.         if (self._conn):
  56.             try:
  57.                 self._cursor = self._conn.cursor(dictionary=True)
  58.                 self._cursor.execute(sql)
  59.                 result = self._cursor.fetchall()
  60.             except Exception:
  61.                 result = False
  62.                 logger.warning("query database exception SQL=" + sql)
  63.         return result

  64.     # 查询所有数据,不带字段名
  65.     def fetchall(self, sql):
  66.         result = ''
  67.         if (self._conn):
  68.             try:
  69.                 self._cursor.execute(sql)
  70.                 result = self._cursor.fetchall()
  71.             except Exception:
  72.                 result = False
  73.                 logger.warning("query database exception SQL=" + sql)
  74.         return result

  75.     # 查询一条数据,带字段名
  76.     def fetch_one(self, sql):
  77.         result = ''
  78.         if (self._conn):
  79.             try:
  80.                 self._cursor = self._conn.cursor(dictionary=True)
  81.                 self._cursor.execute(sql)
  82.                 result = self._cursor.fetchone()
  83.             except Exception:
  84.                 result = False
  85.                 logger.warning("query database exception SQL=" + sql)
  86.         return result

  87.     # 查询一条数据,不带字段名
  88.     def fetchone(self, sql):
  89.         result = ''
  90.         if (self._conn):
  91.             try:
  92.                 self._cursor.execute(sql)
  93.                 result = self._cursor.fetchone()
  94.             except Exception:
  95.                 result = False
  96.                 logger.warning("query database exception SQL=" + sql)
  97.         return result

  98.     # 关闭数据库连接
  99.     def close(self):
  100.         # 如果数据打开,则关闭;否则没有操作
  101.         if (self._conn):
  102.             try:
  103.                 if (type(self._cursor) == 'object'):
  104.                     self._cursor.close()
  105.                 if (type(self._conn) == 'object'):
  106.                     self._conn.close()
  107.             except Exception:
  108.                 # self._logger.warn("close database exception, %s,%s,%s" % (data, type(self._cursor), type(self._conn)))
  109.                 logger.warning("close database exception,%s,%s" % ( type(self._cursor), type(self._conn)))
  110.         return True
复制代码




如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2019-12-26 21:44 | 显示全部楼层
6666
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

发表于 2019-12-26 21:49 | 显示全部楼层
好的,非常感谢
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

发表于 2019-12-26 21:57 | 显示全部楼层
感谢楼主分享
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

发表于 2019-12-26 21:58 | 显示全部楼层
谢谢大牛
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

发表于 2019-12-26 22:19 | 显示全部楼层
谢谢分享
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

发表于 2019-12-26 22:25 | 显示全部楼层
谢谢大佬
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

发表于 2019-12-26 23:16 | 显示全部楼层
6666666666
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

RSS订阅|手机版|小黑屋|广告投放|大牛论坛

GMT+8, 2024-6-6 20:48 , Processed in 0.042213 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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