老熟女激烈的高潮_日韩一级黄色录像_亚洲1区2区3区视频_精品少妇一区二区三区在线播放_国产欧美日产久久_午夜福利精品导航凹凸

重慶分公司,新征程啟航

為企業提供網站建設、域名注冊、服務器等服務

怎么用Python代碼實現新聞爬蟲

本篇內容介紹了“怎么用Python代碼實現新聞爬蟲”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

成都創新互聯公司基于分布式IDC數據中心構建的平臺為眾多戶提供川西大數據中心 四川大帶寬租用 成都機柜租用 成都服務器租用。

新聞源:Reddit

我們可以通過Reddit提交新聞鏈接并為之投票,因此Reddit是個很好的新聞來源。但接下來的問題是:怎樣才能獲取每天最流行的新聞?在考慮抓取之前,我們應該先考慮目標網站有沒有提供API。因為使用API完全合法,更重要的是它能提供機器可讀的數據,這樣就無需再分析HTML了。幸運的是Reddit提供了API。我們可以從API列表中找到所需的功能:/top。該功能可以返回Reddit或指定subreddit上最流行的新聞。接下來的問題是:這個API怎么用?仔細閱讀了Reddit的文檔之后,我找到了最有效的用法。第一步:在Reddit上創建一個應用。登錄之后前往“preferences  → apps”頁面,底部有個名為“create another app...”的按鈕。點擊后創建一個“script”類型的應用。我們不需要提供“about  url”或“redirect url”,因為這個應用不對公眾開放,也不會被別人使用。

怎么用Python代碼實現新聞爬蟲

應用創建之后,可以在應用信息里找到App ID和Secret。

怎么用Python代碼實現新聞爬蟲

下個問題是如何使用App  ID和Secret。由于我們只需獲取指定SubReddit上最流行的新聞,而無需訪問任何與用戶相關的信息,所以理論上來說我們無需提供用戶名或密碼之類的個人信息。Reddit提供了“Application  Only  OAuth”的形式,通過這種方式,應用可以匿名訪問公開的信息。運行下面這條命令:

$ curl -X POST -H 'User-Agent: myawesomeapp/1.0' -d grant_type=client_credentials --user 'OUR_CLIENT_ID:OUR_CLIENT_SECRET'  https://www.reddit.com/api/v1/access_token

該命令會返回access token:

{"access_token": "ABCDEFabcdef0123456789", "token_type": "bearer", "expires_in": 3600, "scope": "*"}

太好了!有了access  token之后就可以大展拳腳了。最后,如果不想自己寫API的訪問代碼的話,可以使用Python客戶端:https://github.com/praw-dev/praw先做一下測試,從/r/Python獲取最流行的5條新聞:

>>> import praw >>> import pprint >>> reddit = praw.Reddit(client_id='OUR_CLIENT_ID', ...                      client_secret='OUR_SECRET', ...                      grant_type='client_credentials', ...                      user_agent='mytestscript/1.0') >>> subs = reddit.subreddit('Python').top(limit=5) >>> pprint.pprint([(s.score, s.title) for s in subs]) [(6555, 'Automate the boring stuff with python - tinder'),  (4548,   'MS is considering official Python integration with Excel, and is asking for '   'input'),  (4102, 'Python Cheet Sheet for begineers'),  (3285,   'We started late, but we managed to leave Python footprint on r/place!'),  (2899, "Python Section at Foyle's, London")]

成功了!

抓取新聞頁面

下一步的任務是抓取新聞頁面,這其實很簡單。通過上一步我們可以得到Submission對象,其URL屬性就是新聞的地址。我們還可以通過domain屬性過濾掉那些屬于Reddit自己的URL:

subs = [sub for sub in subs if not sub.domain.startswith('self.')]

我們只需要抓取該URL即可,用Requests很容易就可以做到:

for sub in subs:   res = requests.get(sub.url)   if (res.status_code == 200 and 'content-type' in res.headers and       res.headers.get('content-type').startswith('text/html')):     html = res.text

這里我們略過了content type不是text/html的新聞地址,因為Reddit的用戶有可能會提交直接指向圖片的鏈接,我們不需要這種。

提取新聞內容

下一步是從HTML中提取內容。我們的目標是提取新聞的標題和正文,而且可以忽略其他不需要閱讀的內容,如頁首、頁腳、側邊欄等。這項工作很難,其實并沒有通用的完美解決辦法。雖然BeautifulSoup可以幫我們提取文本內容,但它會連頁首頁腳一起提取出來。不過幸運的是,我發現目前網站的結構比以前好很多。沒有表格布局,也沒有和
,整個文章頁面清晰地用

標出了標題和每個段落。而且絕大部分網站會把標題和正文放在同一個容器元素中,比如像這樣:

Site Navigation
    
     Page Title

      
     

Paragraph 1

     

Paragraph 2

   
 
  
Copyright...

這個例子中頂層的

就是用于標題和正文的容器。所以可以利用如下算法找到正文:

  • 找到

    作為標題。出于SEO的目的,通常頁面上只會有一個

    ;

  • 找到

    的父元素,檢查該父元素是否包含足夠多的

    ;

  • 重復第2步,直到找到一個包含足夠多

    的父元素,或到達元素。如果找到了包含足夠

    的父元素,則該父元素就是正文的容器。如果在找到足夠的

    之前遇到了,說明頁面不包含任何可供閱讀的內容。

這個算法雖然非常簡陋,并沒有考慮任何語義信息,但完全行得通。畢竟,算法運行失敗時只需要忽略掉那篇文章就行了,少讀一篇文章沒什么大不了的……當然你可以通過解析

或#main、.sidebar等語義元素來實現更準確的算法。用這個算法可以很容易地寫出解析代碼:

soup = BeautifulSoup(text, 'html.parser') # find the article title h2 = soup.body.find('h2') # find the common parent for 

 and all 

s. root = h2 while root.name != 'body' and len(root.find_all('p')) < 5:   root = root.parent if len(root.find_all('p')) < 5:   return None # find all the content elements. ps = root.find_all(['h3', 'h4', 'h5', 'h6', 'h7', 'p', 'pre'])

這里我利用len(root.find_all('p')) <  5作為正文過濾的條件,因為真正的新聞不太可能少于5個段落。大家可以根據需要調整這個值。

轉換成易于閱讀的格式

最后一步是將提取出的內容轉換為易于閱讀的格式。我選擇了Markdown,不過你可以寫出更好的轉換器。本例中我只提取了和

,所以簡單的函數就能滿足要求:

ps = root.find_all(['h3', 'h4', 'h5', 'h6', 'h7', 'p', 'pre']) ps.insert(0, h2)    # add the title content = [tag2md(p) for p in ps] def tag2md(tag):   if tag.name == 'p':     return tag.text   elif tag.name == 'h2':     return f'{tag.text}\n{"=" * len(tag.text)}'   elif tag.name == 'h3':     return f'{tag.text}\n{"-" * len(tag.text)}'   elif tag.name in ['h4', 'h5', 'h6', 'h7']:     return f'{"#" * int(tag.name[1:])} {tag.text}'   elif tag.name == 'pre':     return f'```\n{tag.text}\n```'

完整的代碼

跑一下試試:

Scraping /r/Python...   - Retrieving https://imgs.xkcd.com/comics/python_environment.png       x fail or not html   - Retrieving https://thenextweb.com/dd/2017/04/24/universities-finally-realize-java-bad-introductory-programming-language/#.tnw_PLAz3rbJ       => done, title = "Universities finally realize that Java is a bad introductory programming language"   - Retrieving https://github.com/numpy/numpy/blob/master/doc/neps/dropping-python2.7-proposal.rst       x fail or not html   - Retrieving http://www.thedurkweb.com/sms-spoofing-with-python-for-good-and-evil/       => done, title = "SMS Spoofing with Python for Good and Evil"   ...

抓取的新聞文件:

怎么用Python代碼實現新聞爬蟲

“怎么用Python代碼實現新聞爬蟲”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注創新互聯網站,小編將為大家輸出更多高質量的實用文章!


文章標題:怎么用Python代碼實現新聞爬蟲
標題網址:http://www.xueling.net.cn/article/jddcis.html
在線咨詢
服務熱線
服務熱線:028-86922220
TOP
主站蜘蛛池模板: 亚洲一区二区三区四区视频 | 亚洲领先的自拍视频网站 | 国产一卡二卡三卡四卡网站 | 亚洲香蕉av | 99精品国产在热久久无毒不卡 | 无码人妻毛片丰满熟妇区毛片国产 | 一本久久久久 | 日韩天码| 日韩夜精品精品免费观看 | 女女女女bbbb毛片免费视频 | 精品无码中文字幕在线 | www激情| 国产a级一级片 | 夜夜调教禁脔欢爱h | 日本三级黄在线观看 | 男人和女人日b视频 | 在线视频自拍 | 99极品在线 | av播放在线 | 国产99久久久国产精品~~牛 | 日韩熟女精品一区二区三区 | 亚洲精品免费一区二区三区 | 欧美一级二级三级视频 | 久久久国产一区二区三区 | 国产精品无码翘臀在线看 | 中文字幕一线产区和二线区的区别 | 高清国产一区二区三区在线 | 国产色播视频 | 一区二区不卡视频 | 日韩精品视频一区二区三区 | 亚洲一区二区三区小说 | 少妇的肥蝴蝶18p | 国产欧美一区二区三区视频 | 欧美性播放 | 成人免费看片 | 91综合中文字幕乱偷在线 | 国产欧美日韩亚洲 | 国产乱人偷精品免费视频 | 啊轻点灬大JI巴太粗熟妇 | 男人扒开女人腿桶到爽免费av | 野花日本大全免费观看中文版 |