精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

如何用 100 行 Python 代碼實現新聞爬蟲?這樣可算成功?

開發 后端
每天我都要坐地鐵上班,而地鐵里信號差。但我希望在坐地鐵的時候讀些新聞,于是就寫了下面這個新聞爬蟲。我并沒有打算做很漂亮的應用,所以只完成了原型,它可以滿足我最基本的需求。其思路很簡單。

每天我都要坐地鐵上班,而地鐵里信號差。但我希望在坐地鐵的時候讀些新聞,于是就寫了下面這個新聞爬蟲。我并沒有打算做很漂亮的應用,所以只完成了原型,它可以滿足我最基本的需求。其思路很簡單:

找到新聞源;用Python抓取新聞;利用BeautifulSoup分析HTML并提取出內容;轉換成容易閱讀的格式并通過郵件發送。

下面詳細介紹每個部分的實現。

新聞源: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”,因為這個應用不對公眾開放,也不會被別人使用。

 

如何用 100 行 Python 代碼實現新聞爬蟲?這樣可算成功?

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

 

如何用 100 行 Python 代碼實現新聞爬蟲?這樣可算成功?

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

  1. $ 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:

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

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

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

成功了!

抓取新聞頁面

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

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

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

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

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

提取新聞內容

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

 

  1. <header>Site Navigation</header> 
  2. <div id="#main"
  3.   <section
  4.     <h1 class="title">Page Title</h1> 
  5.   </section
  6.   <section
  7.     <p>Paragraph 1</p> 
  8.     <p>Paragraph 2</p> 
  9.   </section
  10. </div> 
  11. <aside>Sidebar</aside> 
  12. <footer>Copyright...</footer> 

這個例子中頂層的<div id="#main">就是用于標題和正文的容器。所以可以利用如下算法找到正文:

  • 找到<h1>作為標題。出于SEO的目的,通常頁面上只會有一個<h1>;
  • 找到<h1>的父元素,檢查該父元素是否包含足夠多的<p>;
  • 重復第2步,直到找到一個包含足夠多<p>的父元素,或到達<body>元素。如果找到了包含足夠<p>的父元素,則該父元素就是正文的容器。如果在找到足夠的<p>之前遇到了<body>,說明頁面不包含任何可供閱讀的內容。

這個算法雖然非常簡陋,并沒有考慮任何語義信息,但完全行得通。畢竟,算法運行失敗時只需要忽略掉那篇文章就行了,少讀一篇文章沒什么大不了的……當然你可以通過解析<header>、<footer>或#main、.sidebar等語義元素來實現更準確的算法。用這個算法可以很容易地寫出解析代碼:

 

  1. soup = BeautifulSoup(text, 'html.parser'
  2. # find the article title 
  3. h1 = soup.body.find('h1'
  4. # find the common parent for <h1> and all <p>s. 
  5. root = h1 
  6. while root.name != 'body' and len(root.find_all('p')) < 5: 
  7.   root = root.parent 
  8. if len(root.find_all('p')) < 5: 
  9.   return None 
  10. # find all the content elements. 
  11. ps = root.find_all(['h2''h3''h4''h5''h6''p''pre']) 

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

轉換成易于閱讀的格式

最后一步是將提取出的內容轉換為易于閱讀的格式。我選擇了Markdown,不過你可以寫出更好的轉換器。本例中我只提取了和<h#>和<p>、<pre>,所以簡單的函數就能滿足要求:

  1. ps = root.find_all(['h2''h3''h4''h5''h6''p''pre']) 
  2. ps.insert(0, h1)    # add the title 
  3. content = [tag2md(p) for p in ps] 
  4. def tag2md(tag): 
  5.   if tag.name == 'p'
  6.     return tag.text 
  7.   elif tag.name == 'h1'
  8.     return f'{tag.text}\n{"=" * len(tag.text)}' 
  9.   elif tag.name == 'h2'
  10.     return f'{tag.text}\n{"-" * len(tag.text)}' 
  11.   elif tag.name in ['h3''h4''h5''h6']: 
  12.     return f'{"#" * int(tag.name[1:])} {tag.text}' 
  13.   elif tag.name == 'pre'
  14.     return f'```\n{tag.text}\n```' 

完整的代碼

我在Github上分享了完整的代碼,鏈接如下:https://gist.github.com/charlee/bc865ba8aac295dd997691310514e515正好100行 ,跑一下試試:

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

抓取的新聞文件:

 

如何用 100 行 Python 代碼實現新聞爬蟲?這樣可算成功?

最后需要做的是將這個腳本放在服務器上,設置好cronjob每天跑一次,然后將生成的文件發到我的信箱。我沒有花太多時間關注細節,所以其實這個腳本還有很多值得改進的地方。有興趣的話你可以繼續添加更多的功能,如提取圖像等。

責任編輯:未麗燕 來源: 今日頭條
相關推薦

2020-07-20 09:20:48

代碼geventPython

2015-08-10 11:09:09

Python代碼Python

2020-08-21 13:40:17

Python代碼人體膚色

2018-02-08 16:45:22

前端JS粘貼板

2021-11-03 18:01:21

Python爬蟲微信群

2021-12-16 06:21:16

React組件前端

2020-02-28 15:33:12

代碼人工智能檢測

2023-05-04 07:34:37

Rust代碼CPU

2024-09-23 10:00:00

代碼Python

2023-11-27 07:10:06

日志中間件

2018-06-19 08:35:51

情感分析數據集代碼

2015-02-09 10:43:00

JavaScript

2018-05-17 10:05:24

運行iPadPython

2018-01-10 22:19:44

2020-05-09 10:38:31

Python透視表數據

2025-05-22 07:40:32

2019-05-05 09:46:01

Python代碼神經網絡

2010-03-03 09:30:40

Python實現網頁爬

2018-01-23 09:17:22

Python人臉識別

2021-03-08 15:04:48

編程Python代碼
點贊
收藏

51CTO技術棧公眾號

欧美日韩免费在线| 天天躁日日躁成人字幕aⅴ| 男人天堂一区二区| 欧美特黄一级| 亚洲欧美视频在线| 一本之道在线视频| 国产免费福利视频| 亚洲日本成人| 欧美性猛交xxxx免费看久久久| 国产精品久久一区主播| 久草手机视频在线观看| 青青草久久爱| 欧美一区二区三区在线观看| 欧美日韩一区二区视频在线观看| 99在线小视频| 日韩成人伦理电影在线观看| 欧美精品videos| a级免费在线观看| 色婷婷成人在线| 色一情一乱一区二区三区| 美女被久久久| 一区二区三区视频免费| 中国极品少妇videossexhd | 色七七影院综合| 亚洲18在线看污www麻豆| 国模私拍一区二区国模曼安| 国产精品一级片| 欧美伊久线香蕉线新在线| 手机在线免费看毛片| 2020国产精品极品色在线观看| 欧美日韩久久一区| 日韩欧美一区二区三区四区| 亚洲AV无码精品色毛片浪潮| 美女在线视频一区| 国内自拍欧美激情| 久久久久成人精品无码| 91日韩免费| 深夜福利亚洲导航| 久久精品色妇熟妇丰满人妻| 久久久久久久国产精品毛片| 国产精品亚洲成在人线| 91香蕉视频污| 国产精品久久久久久久久久久久冷 | 一区二区三区四区在线播放| 视频一区不卡| 欧美日韩伦理片| 成人免费av在线| 99国产在线| 高清乱码免费看污| 国产精品日韩精品欧美精品| 国产亚洲欧洲高清| 日韩福利在线视频| 日韩欧美午夜| 国产视频亚洲精品| 国产伦精品一区二区三区88av| 亚洲伊人av| 欧美色xxxx| 成年人在线看片| av亚洲一区二区三区| 欧美综合天天夜夜久久| 在线免费视频一区| 在线播放成人| 欧美成人一区二区三区在线观看| 男人女人拔萝卜视频| swag国产精品一区二区| 亚洲第一免费网站| 人妻少妇精品视频一区二区三区| 五月综合久久| 这里只有精品在线播放| 可以免费看av的网址| 一区二区中文| 91成人在线播放| 久久久精品毛片| 精彩视频一区二区| 大波视频国产精品久久| 青青色在线视频| 国产精品色哟哟| 免费看污污视频| 高清精品在线| 欧美午夜影院一区| 在线成人免费av| 日韩在线黄色| 日韩在线观看网站| 国产一级在线免费观看| 久久久久久9| 成人免费看黄网站| 欧美一级性视频| 国产精品麻豆视频| 99久久免费观看| 亚洲成人看片| 日韩写真欧美这视频| 久久久久国产精品区片区无码| 欧美综合一区| 欧美丰满少妇xxxxx| 天堂网视频在线| 国产精品66部| 日韩欧美三级电影| 国产盗摄在线视频网站| 欧美视频一区二区| 妖精视频一区二区| 欧美xxav| 欧美一区二区影院| 99在线观看精品视频| 91网站黄www| 男女激烈动态图| 欧美片第1页| 亚洲第一页在线| 国产午夜精品理论片在线| 一本色道久久综合亚洲精品高清 | 欧美美女在线| 色综合久久久888| 美女黄页在线观看| a级高清视频欧美日韩| 女同性恋一区二区| 成人福利片在线| 亚洲毛片一区二区| 精品人妻在线播放| 国内精品视频一区二区三区八戒| 日本黄网免费一区二区精品| av中文资源在线资源免费观看| 欧美精品久久99久久在免费线| 免费黄色在线视频| 亚洲国产一区二区三区高清| 亚洲va国产va天堂va久久| 成年网站在线| 日本韩国欧美三级| 日本黄色特级片| 亚洲精品日韩久久| 99国产视频在线| av免费在线观看网址| 欧美色视频一区| 国产精品久久免费观看| 免费在线观看成人av| 久久99精品久久久久久青青日本| 色噜噜狠狠狠综合欧洲色8| 7777女厕盗摄久久久| 美女网站视频色| 免费在线看一区| 天天综合色天天综合色hd| 成人性生活视频| 亚洲日本成人网| 日韩熟女一区二区| 久久久美女毛片| 日韩在线xxx| 亚洲欧美日本伦理| 国产成人综合av| 福利在线午夜| 欧美日韩国产首页在线观看| 少妇高潮惨叫久久久久| 麻豆91精品91久久久的内涵| 天堂精品视频| 国产精品va视频| 欧美成人激情在线| 亚洲不卡免费视频| 亚洲高清免费在线| 精品国产人妻一区二区三区| 国产欧美短视频| 欧美一区二区三区四区五区六区| 唐人社导航福利精品| 影音先锋欧美精品| 91亚洲国产成人精品一区| 亚洲三级免费观看| 娇妻高潮浓精白浆xxⅹ| 国产欧美91| 手机看片福利永久国产日韩| 白嫩亚洲一区二区三区| 欧美日韩国产成人在线观看| 二区三区在线视频| 欧美体内谢she精2性欧美| 永久免费成人代码| 精品在线视频一区| 日本黄色片一级片| 九九在线精品| 91久久精品国产| 538在线视频| 亚洲色图狂野欧美| 国产精品系列视频| 午夜精品久久久久久久久久 | 亚洲久草在线视频| 国产精品手机在线观看| 日韩在线观看一区二区| 欧美日韩视频免费在线观看| 成人免费在线电影网| 日本精品久久久| 中文av资源在线| 亚洲美女精品成人在线视频| 日本熟妇乱子伦xxxx| 欧美激情在线一区二区三区| 国产女同无遮挡互慰高潮91| 亚洲久久成人| 一级二级三级欧美| 久久亚州av| 成人性生交xxxxx网站| 国产一二在线播放| 精品国产一区二区在线| 韩国av电影在线观看| 欧美性videosxxxxx| 国产福利久久久| 中文字幕一区二区三区精华液| 免费日本黄色网址| 久草在线在线精品观看| 国产乱子伦农村叉叉叉| 亚洲色图网站| 日本精品二区| 久久97久久97精品免视看秋霞| 国产精自产拍久久久久久蜜| 精精国产xxxx视频在线野外 | 日韩电影免费观看在| 亚洲日本一区二区三区在线| 日本久久久久久久| 欧美午夜大胆人体| www.亚洲成人| 国产福利在线视频| 日韩乱码在线视频| www.好吊色| 欧美精品久久天天躁| 超碰在线免费97| 懂色av中文一区二区三区天美| 精品国产欧美日韩不卡在线观看| 欧美极品另类videosde| 亚洲午夜久久久久久久久红桃| 国产99久久久国产精品潘金 | 精品国产一区二区三区2021| 国产福利精品视频| 老司机成人影院| 欧美一区亚洲一区| 忘忧草在线影院两性视频| 欧美激情在线有限公司| 成人免费看片| 精品国模在线视频| 亚洲黄色精品视频| 91精品免费在线| 国产精品久久久久久久免费| 欧美色成人综合| 国产女优在线播放| 欧美三级三级三级| 中文字幕一区二区人妻痴汉电车| 色综合天天综合网国产成人综合天| 久久网一区二区| 亚洲一区二区三区四区中文字幕| a级黄色片免费看| 一区二区三区中文在线| 69av.com| 亚洲综合久久久久| 日本少妇xxxx动漫| 午夜精品久久久久久久| 日韩欧美a级片| 欧美日韩国产精品一区二区不卡中文| 国产无遮挡免费视频| 亚洲r级在线视频| 精品在线播放视频| 欧美日韩在线视频首页| 人妻丰满熟妇av无码区| 色婷婷综合激情| 亚洲综合成人av| 欧美日韩成人一区| 国产三级按摩推拿按摩| 日韩一区二区三区视频在线 | 国产亚洲精品美女久久久久 | 欧美富婆性猛交| av不卡高清| 日本不卡视频在线播放| 香蕉成人影院| 成人做爰www免费看视频网站| 精品国产一区二| 精品在线一区| 成人羞羞视频在线看网址| 亚洲三级一区| 欧美激情无毛| 99国产精品白浆在线观看免费| 亚洲精品国产首次亮相| 欧美日韩不卡在线视频| 新67194成人永久网站| 91网址在线播放| 国产酒店精品激情| 久久人妻一区二区| 亚洲国产高清在线观看视频| 国产极品美女在线| 午夜精品福利一区二区三区av| av毛片在线免费观看| 3d动漫精品啪啪| 五月婷婷在线观看视频| 中文字幕自拍vr一区二区三区| 四虎影视国产在线视频| 欧洲亚洲妇女av| 欧美videos粗暴| 国产伦一区二区三区色一情 | 黄色一级片国产| 男人的天堂亚洲在线| 亚洲天堂av一区二区三区| av一二三不卡影片| 中文国语毛片高清视频| 偷拍一区二区三区四区| 91久久久久久久久久久久| 亚洲国产精品电影| 欧美jizzhd69巨大| 7m第一福利500精品视频| 91精品一区| 欧美日韩国产三区| 欧美区国产区| 亚洲欧洲日本精品| 91在线你懂得| 激情视频在线播放| 欧美色综合天天久久综合精品| 天堂在线中文网| 欧美精品免费看| 欧美黑粗硬大| 日本高清久久一区二区三区| 极品少妇一区二区三区| 手机在线国产视频| 国产午夜精品在线观看| 国产无套粉嫩白浆内谢| 欧美一区二区三区免费| 成人一区二区不卡免费| 77777少妇光屁股久久一区| 亚洲综合影院| 中文字幕一区综合| 日韩av网站在线观看| a级在线观看视频| 亚洲成人资源在线| 精品久久久中文字幕人妻| 日韩中文字幕不卡视频| 免费欧美电影| 欧美精品在线一区| 一区二区三区导航| 亚洲图片综合网| 亚洲国产精品嫩草影院| 亚洲第一视频在线播放| 久久色精品视频| 亚洲伦理久久| 在线观看亚洲视频啊啊啊啊| 欧美96一区二区免费视频| wwwwxxxx国产| 色婷婷一区二区三区四区| 欧美套图亚洲一区| 欧美孕妇性xx| 亚洲尤物av| 成人一区二区三| 久久久www免费人成精品| 狠狠人妻久久久久久| 亚洲另类激情图| 美女福利一区二区| 日产精品久久久一区二区| 手机精品视频在线观看| 国产精品麻豆入口| 日韩欧美精品免费在线| 日本大片在线观看| 国产成人一区二区三区| 超碰成人久久| 日韩va在线观看| 一区二区激情小说| 欧美一级视频免费| 欧美亚洲另类激情另类| 视频国产一区| 三上悠亚av一区二区三区| 国产精品国产三级国产普通话99| 一区二区视频免费| 久久国产精品电影| 福利片一区二区| 日韩网址在线观看| 国产精品人成在线观看免费| 97精品人妻一区二区三区在线| 久久五月情影视| 红杏视频成人| 熟女人妇 成熟妇女系列视频| 亚洲伦理精品| 激情五月婷婷久久| 中文字幕日韩一区| 探花国产精品一区二区| 最近2019好看的中文字幕免费| 涩涩涩久久久成人精品| 国产一级大片免费看| 久久综合色一综合色88| 在线观看av大片| 久久99热这里只有精品国产| sm捆绑调教视频| 欧美日韩国产精品| 欧美18一19xxx性| 97在线看福利| 激情婷婷综合| 久久无码人妻一区二区三区| 亚洲国产精品99久久久久久久久| 国产黄色一级大片| 日本精品一区二区三区在线播放视频 | 免费成人动漫| 91国产丝袜在线放| 久久国产毛片| 男人天堂手机在线视频| 91在线云播放| 99在线精品视频免费观看软件| 911国产网站尤物在线观看| 久久五月天小说| 菠萝菠萝蜜网站| 欧美系列在线观看| 2018av在线| 在线观看一区二区三区三州 | 欧美mv日韩mv亚洲| 日本在线中文字幕一区二区三区| 国产91在线亚洲| 中文一区一区三区高中清不卡|