Skip to content

Instantly share code, notes, and snippets.

@wizzup
Created September 25, 2017 05:36
Show Gist options
  • Save wizzup/5180b7f19e31c8cd9d4dff5b05c67ba0 to your computer and use it in GitHub Desktop.
Save wizzup/5180b7f19e31c8cd9d4dff5b05c67ba0 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"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\">&quot;20+&quot; ไม่ได้ติดเรท แต่ติดเรโทร ขนมย้อนวัย 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