建议使用以下浏览器,以获得最佳体验。 IE 9.0+以上版本 Chrome 31+ 谷歌浏览器 Firefox 30+ 火狐浏览器
请选择 进入手机版 | 继续访问电脑版
设置昵称

在此一键设置昵称,即可参与社区互动!

确定
我再想想
选择版块

妲己

发帖: 3粉丝: 0

级别 : 新手上路

Rank: 1

发消息 + 关注

发表于2018-5-25 09:30:45 82452 楼主 显示全部楼层
[交流吐槽] 榜单爬虫代码

本帖最后由 妲己 于 2018-5-25 09:32 编辑

有几个同学想要看一下爬虫代码,我就贴在这里吧

Python爬虫代码:

  1. import requests
  2. import sqlite3
  3. import time
  4. from bs4 import BeautifulSoup


  5. def get_all():
  6.     print("{} get_all".format(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())))
  7.     url = "http://codecraft.devcloud.huaweicloud.com/Home/TeamScoreDisplays"

  8.     # area = ["成渝", "杭厦", "京津东北", "江山", "上合", "武长", "西北", "粤港澳"]  # 初赛/复赛
  9.     area = ["32进16", "16进8", "8进4", "冠军赛"]  # 决赛模拟赛
  10.     ret = dict()
  11.     for i in range(len(area)):
  12.         # querystring = {"stageKey": "报名/初赛", "subKey": str(i+1), "stageType": "1"}
  13.         # querystring = {"stageKey": "复赛", "subKey": str(i+1), "stageType": "1"}
  14.         querystring = {"stageKey": "决赛模拟赛", "subKey": area[i], "stageType": "2"}
  15.         try:
  16.             response = requests.request("POST", url, params=querystring, timeout=15)
  17.             if response.status_code != 200:
  18.                 print("请求过于频繁")
  19.                 return None
  20.             bs = BeautifulSoup(response.text, "html.parser")
  21.             trs = bs.find_all("tr")
  22.             results = list()
  23.             for tr in trs:
  24.                 tds = tr.find_all("td")
  25.                 team_name = tds[1].get_text()
  26.                 leader_name = tds[2].get_text()
  27.                 school_name = tds[3].get_text()
  28.                 slogan = tds[4].get_text()
  29.                 score = tds[5].get_text()
  30.                 one = list()
  31.                 one.append(team_name)
  32.                 one.append(leader_name)
  33.                 one.append(school_name)
  34.                 one.append(slogan)
  35.                 one.append(score)
  36.                 results.append(one)
  37.             ret[area[i]] = results
  38.         except Exception as e:
  39.             print("{} exception: {}".format(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()), e))
  40.             return None
  41.     return ret


  42. def escape(string):
  43.     return string.replace("'", "''")


  44. def main(sql):
  45.     print("{} main".format(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())))
  46.     ret = get_all()
  47.     if ret is None:
  48.         time.sleep(3)
  49.         return
  50.     try:
  51.         for r in ret:
  52.             for result in ret[r]:
  53.                 kw = dict()
  54.                 kw['team_name'] = escape(result[0])
  55.                 kw['leader_name'] = escape(result[1])
  56.                 kw['school_name'] = escape(result[2])
  57.                 kw['slogan'] = escape(result[3])
  58.                 kw['score'] = float(result[4])
  59.                 kw['area'] = escape(r)
  60.                 kw['update_time'] = int(time.time())
  61.                 if sql.select_team_name_score(result[0], leader_name=result[1], slogan=result[3], score=kw['score'], area=kw['area']):
  62.                     print("{} insert_data: {} {} {}".format(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()),
  63.                                                             kw['team_name'], kw['area'], kw['score']))
  64.                     sql.insert_data(kw)
  65.     except Exception as e:
  66.         print(e)
  67.         time.sleep(2)


  68. class SQL:
  69.     def __init__(self):
  70.         self.conn = None
  71.         self.cursor = None
  72.         self.path = "./data.db"
  73.         self.connect_sql()

  74.     def __del__(self):
  75.         self.close_sql()

  76.     def connect_sql(self):
  77.         self.conn = sqlite3.connect(self.path)
  78.         self.cursor = self.conn.cursor()

  79.     def close_sql(self):
  80.         self.cursor.close()
  81.         self.conn.close()

  82.     def select_all(self):
  83.         sql_select = "select * from data"
  84.         try:
  85.             self.cursor.execute(sql_select)
  86.             results = self.cursor.fetchmany(10)
  87.             # print(results)
  88.             return results
  89.         except Exception as e:
  90.             print('select_all', e)

  91.     def select_team_name_score(self, team_name, leader_name="", slogan="", score=0.0, area=''):
  92.         sql_select = "SELECT team_name, leader_name, slogan, score, area, update_time FROM data WHERE team_name='{}' AND area='{}' ORDER BY update_time DESC LIMIT 1".format(team_name, area)
  93.         try:
  94.             self.cursor.execute(sql_select)
  95.             results = self.cursor.fetchmany(10)
  96.             if not results:
  97.                 return True
  98.             if results[0][3] == float(score) and results[0][1] == leader_name and results[0][2] == slogan and results[0][4] == area:
  99.                 return False  # not insert
  100.             else:
  101.                 return True   # insert
  102.         except Exception as e:
  103.             print('select_team_name_score', e)

  104.     def insert_data(self, kw):
  105.         sql_insert = "INSERT INTO data (team_name, leader_name, school_name, slogan, score, area, update_time)" \
  106.                      " VALUES ('{team_name}', '{leader_name}', '{school_name}', " \
  107.                      "'{slogan}', {score}, '{area}', {update_time})".format(**kw)
  108.         try:
  109.             self.cursor.execute(sql_insert)
  110.             self.conn.commit()
  111.         except Exception as e:
  112.             print('insert_data', sql_insert, e)
  113.             print(kw, '\n')
  114.             self.conn.rollback()


  115. if __name__ == '__main__':
  116.     sql = SQL()
  117.     while True:
  118.         main(sql)
  119.         time.sleep(3)

复制代码



sqlite数据结构:

  1. CREATE TABLE "data" (
  2.   "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
  3.   "team_name" TEXT,
  4.   "leader_name" TEXT,
  5.   "school_name" TEXT,
  6.   "slogan" TEXT,
  7.   "score" real,
  8.   "area" TEXT,
  9.   "update_time" integer
  10. );
复制代码







回复 举报
分享

分享文章到朋友圈

分享文章到微博

高晓云

发帖: 20粉丝: 12

级别 : 管理员

Rank: 9Rank: 9Rank: 9

发消息 + 关注

发表于2018-5-25 10:18:57 沙发 显示全部楼层
coding life!
点赞 回复 举报

袋鼠哟哟哟

发帖: 0粉丝: 0

级别 : 新手上路

Rank: 1

发消息 + 关注

发表于2018-5-25 11:31:40 板凳 显示全部楼层
大佬666
点赞 回复 举报

游客

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