iT邦幫忙

3

python 爬蟲問題

BB 2021-04-28 00:13:342115 瀏覽
  • 分享至 

  • xImage

我是剛開始學爬蟲的新手
想從https://xn--i0yt6h0rn.tw/channel/%E5%8F%B0%E8%A6%96/
得到節目表的文字部分
.

import requests
import bs4
url = "https://xn--i0yt6h0rn.tw/channel/%E5%8F%B0%E8%A6%96/"
header = {"User-Agent":"Moziilla/5.0 (Windows NT 6.1; WOW64)\AppleWebKit/537.6 (KHTML, like Gecko) Chrome/45.0.2454.101\
            Safari/537.36"}
tv_show = requests.get(url, headers = header)
tv_show.encoding = "utf-8"
tv_show = bs4.BeautifulSoup(tv_show.text, "html.parser")
item = tv_show.find_all("div",class_="time ng-binding")
for i in item:
    print(i.text)

以上是我的程式碼
一直沒按法成功抓取
請大神幫幫忙 謝謝

看更多先前的討論...收起先前的討論...
這是用JavaScript做的網頁,無法用一般的方式進行爬取。
froce iT邦大師 1 級 ‧ 2021-04-28 16:12:47 檢舉
純JS才好爬,科科。
BB iT邦新手 4 級 ‧ 2021-04-28 20:45:39 檢舉
樓上怎麼說呢 畢竟我是小菜機??
froce iT邦大師 1 級 ‧ 2021-04-29 08:39:08 檢舉
真的寫過網頁你就知道了,基本上你會想爬的東西也都會是ajax取回來的資料,如果是使用幾個JS框架你基本上得到的都是JSON,不用處理額外的html結構。

爬蟲的中級問題是認證機制,上級...你永遠不會知道後端有什麼辦法搞你。
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

1
微甜的酸
iT邦新手 2 級 ‧ 2021-04-28 01:25:32
最佳解答
import requests
from bs4 import BeautifulSoup
import json
import pandas as pd

url = "https://節目表.tw/channel/台視/index.json"

response = requests.get(url)

soup = BeautifulSoup(response.text, "html.parser")

site_json = json.loads(soup.text)

times = []
names = []
for obj in site_json["list"][0]["values"]:
  times.append(obj["time"])
  names.append(obj["name"])

data = {"時間":times, "節目":names}

df = pd.DataFrame(data)

print(f'{site_json["list"][0]["key"]}的節目表:')
df = df.set_index("時間")

結果圖:
https://ithelp.ithome.com.tw/upload/images/20210428/20128217ZCfvrsmiNp.png

ccutmis iT邦高手 2 級 ‧ 2021-04-28 08:42:57 檢舉

也可以試試改用 requests_html 模組,範例如下:

from requests_html import HTMLSession
url="https://xn--i0yt6h0rn.tw/channel/%E5%8F%B0%E8%A6%96/"
session = HTMLSession()
r = session.get(url)
name_list=list(map(lambda x: x.text, r.html.find('div.name')))
time_list=list(map(lambda x: x.text, r.html.find('div.time')))
for i in range(3,len(name_list)-1):
    print(time_list[i],name_list[i])

執行結果如下:

00:03 天竺鼠車車(0005)(普)
01:03 尋找台灣感動力(0306)(普)
02:03 午夜熱線追蹤(1028)(普)
...略...
21:00 加油!美玲(0163)(普)
22:00 加油!美玲(0164)(普)
22:03 天竺鼠車車(0006)(普)

樓主可以在 google 搜 requests_html 可以找到許多教學資源 例如這個: requests-html快速入門
這個庫跟 requests 的差別就是它可以取得 js rendering 之後的頁面內容,當然有些特殊情況下也是抓不到,那種情況下你也許會需要用到selenium+chromedriver,sorry這是題外話了。

BB iT邦新手 4 級 ‧ 2021-04-28 20:42:42 檢舉

太謝謝樓上兩位了!!

我要發表回答

立即登入回答