teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

3

追記 入力値をASINからJANにへん

2018/01/09 13:16

投稿

umyu
umyu

スコア5846

answer CHANGED
@@ -64,7 +64,7 @@
64
64
  if debug:
65
65
  class MimicArgs:
66
66
  def __init__(self):
67
- self.jan = ['1449355730', '4873117585']
67
+ self.jan = ['9781449355739', '9784873117584', '9784873112992']
68
68
  return MimicArgs()
69
69
  parser = argparse.ArgumentParser(description='Get asin from JANJAN_URL')
70
70
  parser.add_argument('--jan', nargs='+')

2

変更後のソースコードを追加

2018/01/09 13:16

投稿

umyu
umyu

スコア5846

answer CHANGED
@@ -8,4 +8,83 @@
8
8
  mainメソッドで複数の処理を行うのではなくメソッドを分けてくださいな。
9
9
  0. コマンドライン引数で渡されたJanコードをlistとして返す。
10
10
  0. 引数で渡されたlistを元にスクレイピングを行い結果を返す。
11
- 0. 2の結果を表示する。
11
+ 0. 2の結果を表示する。
12
+
13
+ 質問文のコードを改造しました。ご参考まで.
14
+ ```Pyhon
15
+ # -*- coding: utf-8 -*-
16
+ from selenium import webdriver
17
+ from selenium.common.exceptions import NoSuchElementException
18
+ import argparse
19
+ import codecs
20
+ import sys
21
+ from contextlib import closing
22
+ import pprint
23
+
24
+ sys.stdout = codecs.getwriter('utf_8')(sys.stdout)
25
+ sys.stdin = codecs.getreader('utf_8')(sys.stdin)
26
+
27
+
28
+ class Scraper:
29
+ def __init__(self):
30
+ self.target_url = "https://antlion.xsrv.jp/"
31
+ self.driver = webdriver.PhantomJS()
32
+ self.DELAY_SLEEP = 1 # sec
33
+
34
+ def close(self):
35
+ if self.driver is not None:
36
+ self.driver.close()
37
+ self.driver = None
38
+
39
+ def scrap(self, jan):
40
+ v = {'jan': jan}
41
+ try:
42
+ self.driver.implicitly_wait(self.DELAY_SLEEP)
43
+ # JAN code
44
+ self.driver.get(self.target_url)
45
+ self.driver.implicitly_wait(self.DELAY_SLEEP)
46
+ elem = self.driver.find_element_by_xpath('//*[@id="content"]/div[1]/div/form/input[2]')
47
+ elem.send_keys(jan)
48
+ elem = self.driver.find_element_by_xpath('//*[@id="content"]/div[1]/div/form/input[3]')
49
+ elem.click()
50
+ elems = self.driver.find_elements_by_xpath('//*[@id="content"]/div[2]/div[5]/ul/li')
51
+ for e in elems:
52
+ desc = e.get_attribute('textContent')
53
+ if desc.startswith("ASIN"):
54
+ v['asin'] = desc.split()[-1]
55
+ except NoSuchElementException:
56
+ print("not available")
57
+ except Exception as e:
58
+ print(e)
59
+
60
+ return v
61
+
62
+
63
+ def get_input(debug=True):
64
+ if debug:
65
+ class MimicArgs:
66
+ def __init__(self):
67
+ self.jan = ['1449355730', '4873117585']
68
+ return MimicArgs()
69
+ parser = argparse.ArgumentParser(description='Get asin from JANJAN_URL')
70
+ parser.add_argument('--jan', nargs='+')
71
+ return parser.parse_args()
72
+
73
+
74
+ def main():
75
+ args = get_input()
76
+ pp = pprint.PrettyPrinter()
77
+ with closing(Scraper()) as sc:
78
+ for jan in args.jan:
79
+ products = sc.scrap(jan)
80
+ pp.pprint(products)
81
+
82
+
83
+ if __name__ == "__main__":
84
+ main()
85
+
86
+ ```
87
+
88
+ ■謝辞
89
+ mkgrei様の回答文のソースコードを参考に致しました。
90
+ 素晴らしいソースコードありがとうございます。

1

変更!

2018/01/09 12:57

投稿

umyu
umyu

スコア5846

answer CHANGED
@@ -5,7 +5,7 @@
5
5
  ```
6
6
  このコードproductsが空ですが論理的に破綻してませんか?
7
7
 
8
- mainメソッドで複数の処理を行うのではなくメソッドを分けてくださいな。
8
+ mainメソッドで複数の処理を行うのではなくメソッドを分けてくださいな。
9
- 1,コマンドライン引数で渡されたJanコードをlistとして返す。
9
+ 0. コマンドライン引数で渡されたJanコードをlistとして返す。
10
- 2,引数で渡されたlistを元にスクレイピングを行い結果を返す。
10
+ 0. 引数で渡されたlistを元にスクレイピングを行い結果を返す。
11
- 3,2の結果を表示する。
11
+ 0. 2の結果を表示する。