iT邦幫忙

2

鉅亨網財金新聞爬蟲問題

想請問鉅亨網財金新聞爬蟲問題
我是使用scrapy框架+python撰寫爬蟲程式爬取鉅亨網財金新聞資料([https://news.cnyes.com/news/cat/tw_stock]),爬取資料包含發文時間、新聞標題、以及點入標題後的新聞內容資料。去年爬的時候都還可以,但今年爬的時候,鉅亨網改變<新聞內容>的載入方式,改成動態載入,只要停止使用js,內容就無法顯示。有沒有人可以跟我說該用什麼方式爬到<新聞內容>,我的主要爬蟲程式如下,標示#新聞內容,這段程式已經爬不到資料了。


"""
Created on Tue Dec 17 13:45:31 2019

@author: Lcy
"""
import scrapy
from ptt.items import newsItem
import time
import datetime
import json
from scrapy.selector import Selector


def setdate():

    
        Strbegine = '2020-01-01 16:00:00' 
        Strend = '2020-01-01 18:59:59'    
        
        #日期字串轉成時間格式
        beginetime = time.strptime(Strbegine,"%Y-%m-%d %H:%M:%S")
        endtime = time.strptime(Strend,"%Y-%m-%d %H:%M:%S")
        #時間格式轉換成時間戳記
        beginetimeStamp = int(time.mktime(beginetime))
        endtimeStamp = int(time.mktime(endtime))
        print("起始時間=",beginetime," \n戳記=",beginetimeStamp)
        print("截止時間=",endtime," \n戳記=",endtimeStamp)
        
        return beginetimeStamp,endtimeStamp

class NewsSpider_mdays(scrapy.Spider):
    name = 'news_mdays'
    allowed_domains = ['news.cnyes.com']
    
    startAt,endAT = setdate()
    url ='https://news.cnyes.com/api/v3/news/category/tw_stock?startAt={}&endAt={}&limit=30'.format(startAt,endAT)
    print("url=",url)
    start_urls = [url]

    counts = 0 #設定抓取筆數

    print("經過NewsSpider_mdays") 
    
    
    def parse(self, response):
        print("進入parse")
        jsondata = json.loads(response.text)
        
        prev_page_url = jsondata['items']['prev_page_url']
        next_page_url = jsondata['items']['next_page_url']
        
        last_page = jsondata['items']['last_page']
        newsdatalist = jsondata['items']['data']       
        
        print("總共 {} 頁".format(last_page))
        print("prev_page_url=",prev_page_url)
        print("next_page_url=",response.urljoin(next_page_url)) 
             
        
        for item in newsdatalist:
            newsid = item['newsId']
            newstitle = item['title']            
            newsid_url = "https://news.cnyes.com/news/id/{}?exp=a".format(newsid) 
            print("item=",newsid)
            print("newstitle=",newstitle)  
            print("newsid_url=",newsid_url)
            yield scrapy.Request(newsid_url, callback=self.parse_news)
        
        
        
        if next_page_url != None: #下頁#          
            yield scrapy.Request("https://news.cnyes.com" + next_page_url,callback=self.parse)                     
  
            
    def parse_news(self, response):
        print("進入parse_news")
        item = newsItem()
        content="" #文章內容
        datetime_str=""

        if len(response.xpath('//div[contains(@class,"_uo1n")]')) >0:
            
            datetime_str = response.xpath('//div[contains(@class,"_uo1n")]//time/text()')[0].extract() #日期           
            
            print(response.xpath('//div[contains(@class,"_uo1n")]//h1/text()')[0].extract())
            print(response.xpath('//div[contains(@class,"_uo1n")]/div[@class="_1R6L"]/span/span/text()')[0].extract())
            print('datetime_str = ',datetime.datetime.strptime(datetime_str, '%Y/%m/%d %H:%M'))
            print(response.url)
            
            item['newstitle']  = response.xpath('//div[contains(@class,"_uo1n")]//h1/text()')[0].extract()  #標題
            item['newsauthor'] = response.xpath('//div[contains(@class,"_uo1n")]/div[@class="_1R6L"]/span/span/text()')[0].extract()
            item['newsdate'] =  datetime.datetime.strptime(datetime_str, '%Y/%m/%d %H:%M')
            item['newsurl'] = response.url            
         
        
        #新聞內容....>此處爬不到資料
        if len(response.xpath('//div[contains(@itemprop,"articleBody")]/div[contains(@class,"_2E8y")]/p/text()')) > 0:
            for element in response.xpath('//div[contains(@itemprop,"articleBody")]//div[contains(@class,"_2E8y")]/p/text()'):
                print('element=',element.extract())
                content += element.extract()
      
        item['newscontent'] = content
        yield item

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

5
dragonH
iT邦超人 5 級 ‧ 2020-03-05 11:07:16
最佳解答

我怎麼覺得他現在會比較好爬

他的 api url

js render 的問題應該可以用 requests-html 解決

code

from requests_html import HTMLSession
url = "https://news.cnyes.com/api/v3/news/category/tw_stock"
postUrl = 'https://news.cnyes.com/news/id/{}?exp=a'
session = HTMLSession()
response = session.get(url).json()
posts = response['items']['data']
for post in posts:
    postSession = HTMLSession()
    urlFormat = postUrl.format(post['newsId'])
    print('---{}---'.format(post['title']))
    postResponse = postSession.get(urlFormat)
    postResponse.html.render()
    print(postResponse.html.find('div[itemprop="articleBody"]')[0].text)

result

---全台1951人實施無薪假 充電再出發補貼最高可領19K---
行政院會今 (5) 日針對武漢肺炎 (COVID-19) 疫情因應進行討論,院長蘇貞昌聽取簡報後裁示,各部會須在本周內提出特別條例相關子法。勞動部表示,截至 3 日止,全台通報 49 家企業、1951 人實施減班休息 (無薪假),目前已編列 41.25 億元預算,其中「充電再出發」計畫,參訓勞工最高可領到約 19K 補貼。
因應武漢肺炎疫情可能對產業、就業市場及勞工權益造成衝擊,勞動部今天提出相關措施簡報獲行政院同意,勞動部運用就業安定基金及就業保險基金預算,編列 41.25 億元,擬定短、中、長期計畫,將視疫情變化及產業發展情勢適時啟動各項措施,另外將新增計畫所需經費預估約 30.58 億元。
隨疫情衝擊浮現,產業實施無薪假情況也進一步擴大,勞動部勞動力發展署副署長施貞仰指出,截至 3 日止,全台共有 49 家事業單位通報實施減班休息,實施人數為 1951 人,未來將持續關注疫情發展對就業市場的衝擊。
以短期措施來看,勞動部提出減班休息勞工充電再出發計畫,訓練費用補助從 190 萬提高至 350 萬,時數上限也從 100 小時放寬至 120 小時,若以每小時基本工資 158 元給予補貼,參訓勞工最多可領到 18960 元的訓練津貼,而雇主也須保障勞工每月基本工資 23800 元。
針對失業勞工,勞動部也提供失業給付 6-9 個月,可獲投保薪資 60%;另外還增辦失業勞工子女就學補助,高中職每名最高 6000 元,大專院校則是 24000 元,經費為 6000 萬元。
至於受疫情影響的企業,勞動部也將協助進行安全設備改善,補助金額為 15-200 萬元;針對員工工作生活平衡措施,勞動部也編列 2400 萬元,針對臨時人力照顧鐘點費、員工關懷協助課程及友善措施等提供補助。
此外,勞動部在中期措施也將啟動安心就業計畫和安穩僱用計畫,從就安基金及就保基金編列 16.62 億元經費,補貼減班休息勞工的投保薪資差額 50%,給付期間為 3-6 個月;若企業僱用失業 30 日、失業 3 個月以上的失業者,可獲每人每月 5000 元至 13000 元不等的補助,最長達 12 個月。
---〈百貨餐飲強化外送〉新光三越提前上線 納全台11家店逾260個品牌 穩業績表現---
為因應武漢肺炎疫情對百貨商場內餐飲來客大幅減少的衝擊,百貨龍頭新光三越推出美食外送服務,延攬新光三越店內超過 260 家知名餐飲專櫃共同參與,第一階段服務範圍擴及全台共 11 家分店,京站 (2942-TW) 最新開幕的小碧潭店點,及台北車站店館內全數餐飲品牌,均已加入外送行列,藉此穩住業績表現。
主要店點均位於百貨內的連鎖餐飲業者透露,尚未有百貨商場業者願意讓利,若疫情持續下去,不排除最快在 1-2 個月內會出現餐飲品牌出走潮,而餐飲業過去搶插旗百貨商場的趨勢,也可能因此緩和。
新光三越說明,美食外送服務原本計畫第三季推出,但因應疫情,團隊加快腳步僅花費 4 周的時間,完成與兩大外送平台 Uber Eats 和 foodpanda 合作、延攬店內超過 260 家知名餐飲專櫃共同參與,新光三越 APP 上擴增美食外送服務明日起將正式上線。
新光三越第一階段服務範圍擴及全台 11 家分店,包括台北信義新天地 4 大館、台北南西店、台北站前店、台北天母店、桃園站前店、台中中港店、台南新天地和高雄左營店。
新光三越強調,在此次加入外送的 260 個品牌中,有多達 20 餘個品牌是首次加入美食外送平台的獨家品牌,例如牛排教父鄧有癸主廚打造的 Boulevard 大道 301 牛排、檀島香港茶餐廳、一風堂,以及擁有米其林必比登推薦的清真中國牛肉麵食館等。
京站則說明,台北車站據點內所有餐飲品牌均有和 foodpanda 合作,近期在疫情衝擊下,外送業績逆勢成長達 30%,緩和了來客減少的衝擊,因此,最新開出的小碧潭店,館內餐飲品牌已全數與 Uber Eats 合作,期透過外送餐飲穩住短期業績表現。
---材料-KY外銷旺+擴產效益浮現 Q1營收年增估逾2成---
材料 - KY(4763-TW) 擴產效益顯現,去年第 4 季營收 6.07 億元創新高,今年第 1 季營收由於外銷量挺升,2、3 月營收都將明顯超越去年同期,估今年第 1 季營收將逆勢年成長 2 成以上。
材料 - KY 去年年營收 21.75 億元,改寫年度新高,年增 25.07%;2020 年第 1 季由於醋酸纖維素及絲束等產能完工投產,今年營收將逐季走高,以目前接單及既有出貨估算,第 1 季營收估可達 5.36 億元,年增超過 2 成。
材料 - KY 去年第 4 季營收創高,加上擴充產能對海外客戶訂單持續上揚,1 月營收 1.55 億元,2 月估走揚到 1.8 億元,3 月在手訂單將達 2 億元以上。
材料 - KY 今年產能投產規畫中,絲束與醋片產能將逐步在第 2 季、第 3 季開出,估全年營收逐季走揚;其中,絲束將增加 1 條新線 1000 噸,預期第 1 季完工,第 2 季投產,產能由 1.4 萬噸增加到 1.5 萬噸;醋片則增加 5000 噸產能,估第 2 季完工、第 3 季投產,屆時產能將擴張到 25 萬噸;法人預期,擴產效益挹注下,今年營收可望逐季向上。
材料 - KY 生產醋酸纖維素及絲束,全球僅四個集團大廠供應,是寡佔產業,以國際大廠如塞拉尼斯 (Celanese) 生產規模最大並具主導地位,材料 - KY 的絲束銷售地區則遍及南美、北非 、東南亞、中東等地區。
受疫情影響人流及物流,鮮活果汁 - KY(1256-TW)、基士德 - KY(6641-TW) 4 日公布的 2020 年 2 月營收,雙創掛牌以來新低。法人指出,設廠於中國的 KY 股而言,材料 - KY 今年第 1 季營運表現突出,且材料 - KY 持續擴大市占率,近期打入國際一線菸廠,開始執行 2020 年的醋片及絲束擴廠計畫於上半年全面完成後,經濟規模效益更為顯現,並規劃海外擴廠全球布局,長期成長動能樂觀。
看更多先前的回應...收起先前的回應...
froce iT邦大師 1 級 ‧ 2020-03-05 11:31:24 檢舉

通通改用api真的是佛心來的。XD

dragonH iT邦超人 5 級 ‧ 2020-03-05 11:37:47 檢舉

真的XD 而且還沒擋

也不需要花時間找那些header 要帶/images/emoticon/emoticon01.gif

player iT邦大師 1 級 ‧ 2020-03-05 14:53:54 檢舉

那個網站似乎沒有提供RSS?

dragonH iT邦超人 5 級 ‧ 2020-03-05 15:38:45 檢舉

應該是沒 RSS

我要發表回答

立即登入回答