Created
September 25, 2017 05:36
-
-
Save wizzup/5180b7f19e31c8cd9d4dff5b05c67ba0 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"# รายการTrending\n", | |
"\n", | |
"ดูจาก network log พบว่า Pantip หน้าหลักมี ajax endpoint สำหรับรายการ trending อยู่ (เดาว่า ajax_pantip?p=เลขหน้า)\n", | |
"\n", | |
"ลองดึงมาเฉพาะแต่หน้าแรก" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 1, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"from requests import get\n", | |
"from json import loads" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 2, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"dict_keys(['_id', 'topic_status', 'topic_id', 'disp_topic', 'disp_msg', 'name', 'mid', 'tags', 'cover_img'])" | |
] | |
}, | |
"execution_count": 2, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"ajax_url = \"https://pantip.com/home/ajax_pantip_trend?p=1\"\n", | |
"res = get(ajax_url)\n", | |
"objs = loads(res.content.decode(res.encoding))[\"trend\"]\n", | |
"objs[0].keys()" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"ได้ทั้งหมด 50 รายการ\n", | |
"\n", | |
"key ที่น่าสนใจนำไปไช้ต่อคือ หมายเลชกระทู้ topic_id และ หัวข้อเรื่อง disp_topic" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 3, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"(50,\n", | |
" ['36900567,เพื่อนตกใจมากเมื่อรู้ว่าเราทำงานอะไร',\n", | |
" '36903503,อุทาหรณ์โดนคนข้างห้องขโมยใช้ไฟ ไม่รู้นานเท่าไหร่',\n", | |
" '36142016,คุณคิดว่าควรทำยังไงให้ลูกน้องเจน Y ที่เก่งๆอยู่กับเรานานๆครับ ?',\n", | |
" '36905278,แฟนให้เงินเดือนละ 5000 แต่ขอไปมีอะไรกับคนอื่น',\n", | |
" '36901846,นักศึกษาที่ติดป้าย ‘ห้องนี้คนเต็มเเล้ว’ หน้าห้อง ติดทำไมอยากทราบเรื่องราวจ้า'])" | |
] | |
}, | |
"execution_count": 3, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"len(objs), [f'{o[\"topic_id\"]},{o[\"disp_topic\"]}' for o in objs][0:5]" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"# จำนวนความเห็นของแต่ละกระทู้\n", | |
"\n", | |
"ในแต่ละกระทู้มีความคิดเห็นหลักและความเห็นย่อย แต่การนับจำนวนกระทู้ทำใน javascript ทำให้ต้องดึงผ่าน screen scraping ด้วย web browser (chrome)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 4, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"from shutil import which\n", | |
"from selenium import webdriver\n", | |
"from selenium.webdriver.chrome.options import Options\n", | |
"\n", | |
"[chromedriver,chromebin] = map(which, [\"chromedriver\",\"google-chrome-stable\"])\n", | |
"chrome_options = Options()\n", | |
"chrome_options.binary_location = chromebin\n", | |
"chrome_options.add_argument(\"--headless\")" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 5, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"def get_comments_count(t_id):\n", | |
" url = f\"https://pantip.com/topic/{t_id}\"\n", | |
" driver = webdriver.Chrome(executable_path=chromedriver, chrome_options=chrome_options)\n", | |
" driver.get(url)\n", | |
" count_main = int(driver.find_element_by_id(\"comments-counts\").text.split()[0])\n", | |
" count_sub = sum([int(e.text.split()[2]) for e in driver.find_elements_by_class_name(\"see-more\") if e.text])\n", | |
" count = count_main + count_sub\n", | |
" driver.close()\n", | |
" print(count, url)\n", | |
" return count,count_main,count_sub" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"ทดลองจำกัดแค่ 20 กระทู้แรก เนื่องจากใช้เวลาต่อกระทู้นาน" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 6, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"127 https://pantip.com/topic/36900567\n", | |
"71 https://pantip.com/topic/36903503\n", | |
"184 https://pantip.com/topic/36142016\n", | |
"59 https://pantip.com/topic/36905278\n", | |
"86 https://pantip.com/topic/36901846\n", | |
"23 https://pantip.com/topic/36905963\n", | |
"145 https://pantip.com/topic/36903390\n", | |
"18 https://pantip.com/topic/36903556\n", | |
"35 https://pantip.com/topic/36902623\n", | |
"89 https://pantip.com/topic/36897169\n", | |
"390 https://pantip.com/topic/35612378\n", | |
"72 https://pantip.com/topic/36906535\n", | |
"113 https://pantip.com/topic/36903071\n", | |
"20 https://pantip.com/topic/36905100\n", | |
"87 https://pantip.com/topic/36904103\n", | |
"16 https://pantip.com/topic/36895663\n", | |
"159 https://pantip.com/topic/36892310\n", | |
"130 https://pantip.com/topic/36902859\n", | |
"92 https://pantip.com/topic/36902276\n", | |
"36 https://pantip.com/topic/36905038\n" | |
] | |
} | |
], | |
"source": [ | |
"limit = 20\n", | |
"data = [[get_comments_count(o[\"topic_id\"]), o[\"disp_topic\"], f'https://pantip.com/topic/{o[\"topic_id\"]}'] for o in objs[0:limit]]" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"ทำเป็นตาราง\n", | |
"\n", | |
"(ความเห็นที้งหมด, ความเห็นหลัก, ความเห็นย่อย)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 7, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<table><tr><th>รวม</th><th>หลัก</th><th>ย่อย</th><th>กระทู้</th></tr><tr><td>127</td><td>107</td><td>20</td><td><a href=\"https://pantip.com/topic/36900567\">เพื่อนตกใจมากเมื่อรู้ว่าเราทำงานอะไร</></td></tr><tr><td>71</td><td>47</td><td>24</td><td><a href=\"https://pantip.com/topic/36903503\">อุทาหรณ์โดนคนข้างห้องขโมยใช้ไฟ ไม่รู้นานเท่าไหร่</></td></tr><tr><td>184</td><td>123</td><td>61</td><td><a href=\"https://pantip.com/topic/36142016\">คุณคิดว่าควรทำยังไงให้ลูกน้องเจน Y ที่เก่งๆอยู่กับเรานานๆครับ ?</></td></tr><tr><td>59</td><td>51</td><td>8</td><td><a href=\"https://pantip.com/topic/36905278\">แฟนให้เงินเดือนละ 5000 แต่ขอไปมีอะไรกับคนอื่น</></td></tr><tr><td>86</td><td>53</td><td>33</td><td><a href=\"https://pantip.com/topic/36901846\">นักศึกษาที่ติดป้าย ‘ห้องนี้คนเต็มเเล้ว’ หน้าห้อง ติดทำไมอยากทราบเรื่องราวจ้า</></td></tr><tr><td>23</td><td>10</td><td>13</td><td><a href=\"https://pantip.com/topic/36905963\">10 Abs Exercises For A Flat Stomach แชร์ 10 ท่าออกกำลังกายสร้างกล้ามท้องเลข 11</></td></tr><tr><td>145</td><td>88</td><td>57</td><td><a href=\"https://pantip.com/topic/36903390\">อยู่กับแฟนมา14ปีไม่มีความเจริญก้าวหน้าไม่มีเงินเก็บมีแต่หนี้สินและปัญหาอื่นๆจะทำยังไงดีคิดไม่ตก เครียดมาก</></td></tr><tr><td>18</td><td>17</td><td>1</td><td><a href=\"https://pantip.com/topic/36903556\">รีวิว แอพมือถือช่วยฝึกพูดภาษาอังกฤษ สนทนาแบบตอบโต้กัน สุดเจ๋ง เกิดมาเพื่อฆ่าสถาบันติวภาษา</></td></tr><tr><td>35</td><td>26</td><td>9</td><td><a href=\"https://pantip.com/topic/36902623\">ประสบการณ์ ตะลุยตลาดกวางโจว ฉบับหาของทำธุรกิจ</></td></tr><tr><td>89</td><td>71</td><td>18</td><td><a href=\"https://pantip.com/topic/36897169\">ฝรั่งได้กลิ่นคนไทยเป็นแบบไหน?</></td></tr><tr><td>390</td><td>242</td><td>148</td><td><a href=\"https://pantip.com/topic/35612378\">ผมว่าผมพอจะเริ่มเข้าใจเหตุผลที่จู่ๆผู้ชายก็หายเงียบไปหลังจากคุยกับผู้หญิงไปได้สักระยะหนึ่ง</></td></tr><tr><td>72</td><td>63</td><td>9</td><td><a href=\"https://pantip.com/topic/36906535\">ผู้หญิงคุย line มาแบบนี้น่าคบหรือเอาเป็นแฟนไหมครับ</></td></tr><tr><td>113</td><td>72</td><td>41</td><td><a href=\"https://pantip.com/topic/36903071\">ทำไมบางที่ ถึงนิยมการวาดรูปโปสเตอร์หนัง แทนการใช้เครื่องพิมพ์คะ</></td></tr><tr><td>20</td><td>18</td><td>2</td><td><a href=\"https://pantip.com/topic/36905100\">"20+" ไม่ได้ติดเรท แต่ติดเรโทร ขนมย้อนวัย 20+ เท่านั้นที่เข้าใจ</></td></tr><tr><td>87</td><td>62</td><td>25</td><td><a href=\"https://pantip.com/topic/36904103\">เป็นคนที่ไม่กลัวที่จะทำอะไรคนเดียว ไปไหนมาไหนคนเดียว เป็นอย่างนี้จนชิน จนบางครั้งก็เหงากับการ ต้องอยู่คนเดียว</></td></tr><tr><td>16</td><td>15</td><td>1</td><td><a href=\"https://pantip.com/topic/36895663\">ทำไมพี่ก็อตจิเกี่ยวอะไรกับวอลเลย์บอล</></td></tr><tr><td>159</td><td>96</td><td>63</td><td><a href=\"https://pantip.com/topic/36892310\">ระบายครับ เจอผีหน้าด้านอยากอยู่ในห้องคน(?)เดียวทั้งๆที่ไม่เคยช่วยออกเงินสักบาท</></td></tr><tr><td>130</td><td>86</td><td>44</td><td><a href=\"https://pantip.com/topic/36902859\">ไม่กล้ามีอะไรกับแฟนทั้งๆที่แฟนพร้อมจะมีด้วย แต่เพียงเพราะคำพูดของเธอ</></td></tr><tr><td>92</td><td>49</td><td>43</td><td><a href=\"https://pantip.com/topic/36902276\">ผู้หญิงรักนวลสงวนตัวเดี่ยวนี้ถือว่ามีความคิดแปลกๆแล้วหรอคะ</></td></tr><tr><td>36</td><td>33</td><td>3</td><td><a href=\"https://pantip.com/topic/36905038\">คิดยังไงกับบริษัท ที่ทำงาน ยึดโทรศัพท์ไว้โดยห้ามใช้หรืออย่างว่า คือ แอบเล่นโทรศัพท์ในเวลาทำงาน?</></td></tr></table>" | |
], | |
"text/plain": [ | |
"<IPython.core.display.HTML object>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"from IPython.display import HTML, display\n", | |
"\n", | |
"rows = [f'<tr><td>{d[0][0]}</td><td>{d[0][1]}</td><td>{d[0][2]}</td><td><a href=\"{d[2]}\">{d[1]}</></td></tr>' for d in data]\n", | |
"table = f'<table><tr><th>รวม</th><th>หลัก</th><th>ย่อย</th><th>กระทู้</th></tr>{\"\".join(rows)}</table>'\n", | |
"\n", | |
"display(HTML(table))" | |
] | |
} | |
], | |
"metadata": { | |
"kernelspec": { | |
"display_name": "Python 3", | |
"language": "python", | |
"name": "python3" | |
}, | |
"language_info": { | |
"codemirror_mode": { | |
"name": "ipython", | |
"version": 3 | |
}, | |
"file_extension": ".py", | |
"mimetype": "text/x-python", | |
"name": "python", | |
"nbconvert_exporter": "python", | |
"pygments_lexer": "ipython3", | |
"version": "3.6.2" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 2 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment