{"id":631,"date":"2020-01-09T12:45:44","date_gmt":"2020-01-09T04:45:44","guid":{"rendered":"http:\/\/lox.im\/?p=631"},"modified":"2022-09-16T16:40:03","modified_gmt":"2022-09-16T08:40:03","slug":"%e8%bd%ac%e4%b8%80%e7%99%be%e5%a4%9a%e8%a1%8cpython%e4%bb%a3%e7%a0%81%e5%ae%9e%e7%8e%b0%e6%8a%a2%e7%a5%a8%e5%8a%a9%e6%89%8b","status":"publish","type":"post","link":"https:\/\/lox.im\/index.php\/631.html","title":{"rendered":"\u4e00\u767e\u591a\u884cpython\u4ee3\u7801\u5b9e\u73b0\u62a2\u7968\u52a9\u624b[\u8f6c]"},"content":{"rendered":"\r\n<p>\u4e00.\u00a0\u4ee3\u7801\u4f7f\u7528Python+Splinter\u5f00\u53d1\uff0cSplinter\u662f\u4e00\u4e2a\u4f7f\u7528Python\u5f00\u53d1\u7684\u5f00\u6e90Web\u5e94\u7528\u6d4b\u8bd5\u5de5\u5177\uff0c\u5b83\u53ef\u4ee5\u5e2e\u4f60\u5b9e\u73b0\u81ea\u52a8\u6d4f\u89c8\u7ad9\u70b9\u548c\u4e0e\u5176\u8fdb\u884c\u4ea4\u4e92\u3002<\/p>\r\n<p>\u4e8c.\u00a0\u5b89\u88c5\u597dPython 3\u62162\u90fd\u53ef\u4ee5\uff0c\u7136\u540e\u5b89\u88c5Splinter\u00a0`pip install Splinter<\/p>\r\n<p>\u4e09.\u00a0Splinter<strong>\u6ce8\u610f\u4e8b\u9879<\/strong><\/p>\r\n<p>1. Splinter\u7684Browser\u7c7b\u9ed8\u8ba4\u4f18\u5148\u4f7f\u7528firefox,\u6240\u4ee5\u7528chrome\u7684\u8bdd\uff0c\u9700\u8981\u6307\u5b9adriver_name=\"chrome\",\u53ea\u8981\u517b\u6210\u4e00\u4e2a\u4e60\u60ef\uff0c\u4e0d\u7ba1\u7528\u4ec0\u4e48\u6d4f\u89c8\u5668\u90fd\u6307\u5b9a\uff0c\u95ee\u9898\u4f1a\u51fa\u5f97\u5c11<br \/>2. \u5f53\u7136\uff0c\u9009\u62e9chrome\u7684\u8bdd\uff0c\u9700\u8981\u67e5\u770b\u81ea\u5df1\u6d4f\u89c8\u5668\u7684\u7248\u672c\uff0c\u9700\u8981\u548cchromedriver\u7248\u672c\u5bf9\u5e94(\u4e0d\u662f\u7248\u672c\u53f7\u4e00\u81f4),\u53c2\u8003\u548c\u4e0b\u8f7d<a href=\"http:\/\/blog.csdn.net\/huilan_same\/article\/details\/51896672\" target=\"_blank\" rel=\"external nofollow noopener noreferrer\" rel=\"nofollow\" >\u5730\u5740<\/a><\/p>\r\n<p>\u56db.\u00a0Splinter.broser\u90e8\u5206\u65b9\u6cd5\u4ecb\u7ecd<\/p>\r\n<p>1.\u00a0 findbyid(\"\u63a7\u4ef6id\").first:\u6839\u636eid\u627e\u5230\u7ec4\u4ef6<br \/>2.\u00a0 visis(url):\u8bbf\u95ee\u6307\u5b9a\u7f51\u5740<br \/>3.\u00a0 fill(\"\u586b\u5145\u7684\u5185\u5bb9\"):\u7528\u6307\u5b9a\u5185\u5bb9\u586b\u5145\u7ec4\u4ef6<br \/>4.\u00a0 click():\u70b9\u51fb\u4e8b\u4ef6<br \/>5.\u00a0 reload():\u91cd\u65b0\u52a0\u8f7d\u5f53\u524d\u6587\u6863<\/p>\r\n<p>\u4e94.\u00a0\u4e3b\u8981\u601d\u8def\uff1a<\/p>\r\n<p>1. \u81ea\u52a8\u586b\u5145\u7528\u6237\u540d\uff0c\u5bc6\u7801\uff0c\u70b9\u51fb\u56fe\u7247\u9a8c\u8bc1\u7801(\u624b\u52a8),\u81ea\u52a8\u70b9\u51fb\u8d2d\u7968\u67e5\u8be2\uff0c\u9884\u8ba2\uff0c\u81ea\u52a8\u9009\u62e9\u6307\u5b9a\u4e58\u5ba2\u8fdb\u5165\u63d0\u4ea4\u8ba2\u5355\u9875\u9762<br \/>2. \u9664\u767b\u5f55\u65f6\u7684\u56fe\u7247\u9a8c\u8bc1\u7801\uff0c\u5168\u7a0b\u81ea\u52a8<\/p>\r\n<p>\u516d.\u00a0error(\u4e0b\u9762\u662f\u6211\u5df2\u7ecf\u5c1d\u8bd5\u6210\u529f\u7684):<\/p>\r\n<p>1. OSError: [WinError 193] %1 \u4e0d\u662f\u6709\u6548\u7684 Win32 \u5e94\u7528\u7a0b\u5e8f\u3002<br \/>2. \u89e3\u51b3\u65b9\u6848\uff1achromedriver\u7248\u672c\u548c\u7535\u8111\u6d4f\u89c8\u5668\u7248\u672c\u6620\u5c04\u6ca1\u5bf9\u5e94<br \/>3. ImportError: cannot import name 'Browser'\u3002<br \/>4. \u89e3\u51b3\u65b9\u6848\uff1a\u662f\u5426\u5b89\u88c5\u4e86Splinter\u00a0`pip install Splinter`,\u5c06\u4ee3\u7801\u6587\u4ef6\u548cchromedriver\u653e\u5230\u4e00\u4e2a\u65b0\u6587\u4ef6\u5939\u4e0b\uff0c\u9632\u6b62\u5176\u4ed6\u6587\u4ef6\u7684\u5f71\u54cd<br \/>5. \u8bf7\u5728\u8fd0\u884c\u6587\u4ef6\u524d\uff0c\u5c06\u4ee3\u7801\u5185\u7684\u4e58\u5ba2\uff0c\u7528\u6237\u540d\uff0c\u5bc6\u7801\u6b63\u786e\u586b\u5199\u597d\uff0c\u68c0\u67e5cookies\u662f\u5426\u6b63\u786e<\/p>\r\n<p>\u4e03.\u00a0cookies \u67e5\u770b<\/p>\r\n<p>1. \u8fdb\u5165chrome\u6d4f\u89c8\u5668\uff0c\u6309F12\uff0c\u9009\u4e2dNetWork\u9009\u9879\uff0c\u5982\u4e0b\u56fe<br \/>2. \u8d77\u59cb\u5730\u5740\uff1a`_jc_save_fromStation`\u00a0\u8d2d\u7968\u65f6\u95f4\uff1a`_jc_save_fromDate`\u00a0\u76ee\u7684\u5730\uff1a`_jc_save_toStation`<\/p>\r\n<p>\u516b.\u00a0\u00a0\u8fd0\u884c\u65b9\u6cd5<\/p>\r\n<p>1. python trainticket.py \u5929\u6d25 \u5357\u660c 2018-02-10<br \/>2. OK<\/p>\r\n<p>\u4e5d.\u00a0 \u5177\u4f53\u4ee3\u7801\u5982\u4e0b<\/p>\r\n<div class=\"jb51code\">\r\n<pre class=\"brush:py;\"># -*- coding:utf-8 -*-\r\n \"\"\"\r\n @author Jianxiong Rao\r\n \"\"\"\r\n from splinter.browser import Browser\r\n from time import sleep\r\n import traceback\r\n import time,sys\r\n import os\r\n \r\n class HuoChe(object):\r\n  \"\"\"docstring for Train\"\"\"\r\n  driver_name=''\r\n  executable_path=''\r\n  #\u7528\u6237\u540d \u5bc6\u7801\r\n  username = u\"12306\u5e10\u6237\u540d\"\r\n  passwd = u\"12306\u5bc6\u7801\"\r\n  #cookies\u503c\u81ea\u5df1\u627e \r\n  # \u5929\u6d25%u5929%u6D25%2CTJP \u5357\u660c%u5357%u660C%2CNCG \u6842\u6797%u6842%u6797%2CGLZ\r\n  starts = u\"%u5929%u6D25%2CTJP\"\r\n  ends = u\"%u5357%u660C%2CNCG\"\r\n  #\u65f6\u95f4\u683c\u5f0f2018-02-05\r\n  dtime = u\"2018-02-05\"\r\n  #\u8f66\u6b21,\u9009\u62e9\u7b2c\u51e0\u8d9f,0\u5219\u4ece\u4e0a\u4e4b\u4e0b\u4f9d\u6b21\u70b9\u51fb\r\n  order = 0\r\n  ###\u4e58\u5ba2\u59d3\u540d\r\n  users=[u'\u4e58\u5ba2\u540d']\r\n  ##\u5e2d\u4f4d\r\n  xb=u\"\u4e8c\u7b49\u5ea7\"\r\n  pz=u\"\u6210\u4eba\u7968\"\r\n  \"\"\"\u7f51\u5740\"\"\"\r\n  #12306\u67e5\u8be2URL\r\n  ticket_url = \"https:\/\/kyfw.12306.cn\/otn\/leftTicket\/init\"\r\n  #12306\u767b\u5f55URL\r\n  login_url = \"https:\/\/kyfw.12306.cn\/otn\/login\/init\"\r\n  #\u6211\u768412306URL\r\n  initmy_url = \"https:\/\/kyfw.12306.cn\/otn\/index\/initMy12306\"\r\n  #\u8d2d\u7968URL\r\n  buy=\"https:\/\/kyfw.12306.cn\/otn\/confirmPassenger\/initDc\"\r\n  login_url='https:\/\/kyfw.12306.cn\/otn\/login\/init'\r\n \r\n  def __init__(self):\r\n   self.driver_name = 'chrome'\r\n   self.executable_path = os.getcwd()+'\/chromedriver'\r\n   print(\"Welcome To Use The Tool\")\r\n  \r\n  def login(self):\r\n   self.driver.visit(self.login_url)\r\n   #\u586b\u5145\u5bc6\u7801\r\n   self.driver.fill(\"loginUserDTO.user_name\",self.username)\r\n   #sleep(1)\r\n   self.driver.fill(\"userDTO.password\",self.passwd)\r\n   print(\"\u7b49\u5f85\u9a8c\u8bc1\u7801\uff0c\u81ea\u884c\u8f93\u5165....\")\r\n   while True:\r\n    if self.driver.url != self.initmy_url:\r\n     sleep(1)\r\n    else :\r\n     break\r\n  def start(self):\r\n   self.driver = Browser(driver_name=self.driver_name,executable_path = self.executable_path)\r\n   self.driver.driver.set_window_size(1400,1000)\r\n   self.login()\r\n   #sleep(1)\r\n   self.driver.visit(self.ticket_url)\r\n   try:\r\n    print(\"\u8d2d\u7968\u9875\u9762\u5f00\u59cb....\")\r\n    #sleep(1)\r\n    #\u52a0\u8f7d\u67e5\u8be2\u4fe1\u606f\r\n    self.driver.cookies.add({\"_jc_save_fromStation\":self.starts})\r\n    self.driver.cookies.add({\"_jc_save_toStation\":self.ends})\r\n    self.driver.cookies.add({\"_jc_save_fromDate\":self.dtime})\r\n    \r\n    self.driver.reload()\r\n \r\n    count = 0\r\n    if self.order != 0:\r\n     while self.driver.url == self.ticket_url:\r\n      self.driver.find_bytext(u\"\u67e5\u8be2\").click()\r\n      count += 1\r\n      print(\"\u5faa\u73af\u70b9\u51fb\u67e5\u8be2.... \u7b2c %s \u6b21\"%count)\r\n      #sleep(1)\r\n      try:\r\n       self.driver.find_by_text(u'\u9884\u8ba2')[self.order - 1].click()\r\n      except Exception as e:\r\n       print(e)\r\n       print(\"\u8fd8\u6ca1\u5f00\u59cb\u9884\u8ba2\")\r\n       continue\r\n    else :\r\n     while self.driver.url == self.ticket_url:\r\n      self.driver.find_by_text(u\"\u67e5\u8be2\").click()\r\n      count += 1\r\n      print(\"\u5faa\u73af\u70b9\u51fb\u67e5\u8be2.... \u7b2c %s \u6b21\"%count)\r\n      #sleep(0.8)\r\n      try:\r\n       for i in self.driver.find_by_text(u\"\u9884\u8ba2\"):\r\n        i.click()\r\n        sleep(1)\r\n      except Exception as e:\r\n       print(e)\r\n       print(\"\u8fd8\u6ca1\u5f00\u59cb\u9884\u8ba2 %s \"%count)\r\n       continue\r\n    print(\"\u5f00\u59cb\u9884\u8ba2....\")\r\n    #sleep(1)\r\n    #self.driver.reload()\r\n    sleep(1)\r\n    print(\"\u5f00\u59cb\u9009\u62e9\u7528\u6237....\")\r\n    for user in self.users:\r\n     self.driver.find_by_text(user).last.click()\r\n    print(\"\u63d0\u4ea4\u8ba2\u5355....\")\r\n    sleep(1)\r\n    # self.driver.find_by_text(self.pz).click()\r\n    # self.driver.find_by_id('').select(self.pz)\r\n    # sleep(1)\r\n    # self.driver.find_by_text(self.xb).click()\r\n    # sleep(1)\r\n    self.driver.find_by_id('submitOrder_id').click()\r\n    print(\"\u5f00\u59cb\u9009\u5ea7...\")\r\n    # self.driver.find_by_id('1D').last.click()\r\n    # self.driver.find_by_id('1F').last.click()\r\n    sleep(1.5)\r\n    print(\"\u786e\u8ba4\u9009\u5ea7....\")\r\n    self.driver.find_by_text('qr_submit_id').click()\r\n \r\n   except Exception as e:\r\n    print(e)\r\n \r\n cities={\r\n '\u5929\u6d25':'%u5929%u6D25%2CTJP',\r\n '\u5357\u660c':'%u5357%u660C%2CNCG',\r\n '\u6842\u6797':'%u6842%u6797%2CGLZ'\r\n }\r\n \r\n if __name__==\"__main__\":\r\n  train = HuoChe()\r\n  train.starts = cities[sys.argv[1]]\r\n  train.ends = cities[sys.argv[2]]\r\n  train.dtime = sys.argv[3]\r\n  train.start()\r\n<\/pre>\r\n<\/div>\r\n<p>\u5341.\u00a0\u6e90\u7801\u5730\u5740<\/p>\r\n<p><a href=\"https:\/\/github.com\/raojianxiong\/12306Ticket\/blob\/master\/trainticket.py\" target=\"_blank\" rel=\"external nofollow noopener noreferrer\" rel=\"nofollow\" >12306Ticket<\/a><\/p>\r\n<p>\u4ee5\u4e0a\u4e3a\u8f6c\u8f7d\u81ea<a href=\"https:\/\/www.jb51.net\/\" target=\"_blank\"  rel=\"nofollow\" >\u811a\u672c\u4e4b\u5bb6<\/a>\uff0c\u4ee3\u6211\u6d4b\u8bd5\u53ef\u7528\u540e\u518d\u66f4\u65b0\u4e00\u4e0b\u3002<\/p>\r\n","protected":false},"excerpt":{"rendered":"<p>\u4e00. \u4ee3\u7801\u4f7f\u7528Python+Splinter\u5f00\u53d1\uff0cSplinter\u662f\u4e00\u4e2a\u4f7f\u7528Python\u5f00\u53d1\u7684\u5f00\u6e90Web\u5e94\u7528\u6d4b\u8bd5\u5de5\u5177\uff0c\u5b83\u53ef\u4ee5\u5e2e\u4f60\u5b9e\u73b0\u81ea\u52a8\u6d4f\u89c8\u7ad9\u70b9\u548c\u4e0e\u5176\u8fdb\u884c\u4ea4\u4e92\u3002<\/p>\n<p>\u4e8c. \u5b89\u88c5\u597dPython 3\u62162\u90fd\u53ef\u4ee5","protected":false},"author":1,"featured_media":412,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"emotion":"","emotion_color":"","title_style":"","license":"","footnotes":""},"categories":[4],"tags":[29],"class_list":["post-631","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-internet","tag-python"],"_links":{"self":[{"href":"https:\/\/lox.im\/index.php\/wp-json\/wp\/v2\/posts\/631","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/lox.im\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/lox.im\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/lox.im\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/lox.im\/index.php\/wp-json\/wp\/v2\/comments?post=631"}],"version-history":[{"count":2,"href":"https:\/\/lox.im\/index.php\/wp-json\/wp\/v2\/posts\/631\/revisions"}],"predecessor-version":[{"id":780,"href":"https:\/\/lox.im\/index.php\/wp-json\/wp\/v2\/posts\/631\/revisions\/780"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/lox.im\/index.php\/wp-json\/wp\/v2\/media\/412"}],"wp:attachment":[{"href":"https:\/\/lox.im\/index.php\/wp-json\/wp\/v2\/media?parent=631"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/lox.im\/index.php\/wp-json\/wp\/v2\/categories?post=631"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/lox.im\/index.php\/wp-json\/wp\/v2\/tags?post=631"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}