Python_網路爬蟲(新浪新聞抓取)

来源:http://www.cnblogs.com/zengbojia/archive/2017/07/29/7220190.html
-Advertisement-
Play Games

爬取前的準備: BeautifulSoup的導入:pip install BeautifulSoup4 requests的導入:pip install requests 下載jupyter notebook:pip install jupyter notebook 下載python,配置環境(可使用 ...


爬取前的準備:

  • BeautifulSoup的導入:pip install BeautifulSoup4
  • requests的導入:pip install requests
  • 下載jupyter notebook:pip install jupyter notebook
  • 下載python,配置環境(可使用anocanda,裡面提供了很多python模塊)

 

json

  • 定義 :是一種格式,用於數據交換。

Javascript 對象

  • 定義 : 一種javascript的引用類型

 

中文格式除了‘ utf-8 ’還有‘ GBK ’、‘ GB2312 ’ 、‘ ISO-8859-1 ’、‘ GBK ‘’等

 

用requests可獲取網頁信息

用BeautifulSoup可以將網頁信息轉換為可操作物塊

1 soup = BeautifulSoup(res.text,'html.parser')
2 # 將requests獲取的網頁信息轉換為BeautifulSoup的物件存於soup中,並指明其剖析器為'html.parser',否則會出現警告。

 

用beautifulSoup中的select方法可以獲取相應的元素,且獲取的元素為list形式,可以用for迴圈將其逐個解析出來

1 alink = soup.select('h1')
2 
3 for link in alink:
4     print(link.text)

 

獲取html標簽值後,可以用[‘href’]獲取‘href’屬性的值,如

1 for link in soup.select('a'):
2    print(link['href'])

 

獲取新聞編號:

* .strip()可以去除前後空白格,括弧內加入字元串可以去除指定字元串,rstrip()可以去除右邊的,lstrip()可以去除左邊的;

split('/')根據指定的字元對字元串進行切割

 

re正則表達式的使用:

1 import re
2 
3 m = re.search(' doc-i(.*).shtml ',newsurl)  # 返回在newsurl中匹配到的字元串
4 print(m.group(1))  # group(0)可以取得所有匹配到的部分,group(1)只可以取得括弧內的部分

 

使用for迴圈獲取新聞的多頁鏈接

1 url = 'http://api.roll.news.sina.com.cn/zt_list?channel=news&cat_1=gnxw&cat_2==gdxw1||=gatxw||=zs-pl||=mtjj&level==1||=2&show_ext=1&show_all=1&show_num=22&tag=1&format=json&page={}&callback=newsloadercallback&_=1501000415111'
2  
3 for i in rannge(0,10):
4   print( url.format( i ) )
5 # format可以將url裡面的大括弧(要修改的部分我們把它刪去並換成大括弧)換為我們要加入的值(如上面代碼中的 i)

 

獲取新聞發佈的時間:

  獲取的信息可能會有包含的成分,即會獲取到如出版社的其他我們不需要的元素,可以用contents將裡面的元素分離成list形式,用contents[0]即可獲取相應元素

1 # 獲取出版時間
2 from datetime import datetime
3 
4 res = requests.get('http://news.sina.com.cn/c/nd/2017-07-22/doc-ifyihrmf3191202.shtml')
5 res.encoding = 'utf-8'
6 soup = BeautifulSoup(res.text,'html.parser')
7 timesource = soup.select('.time-source')
8 print(timesource[0].contents[0]) 

  時間字元串轉換 

1 # 字元串轉時間:-strptime
2 dt = datetime.strptime(timesource,'%Y年%m月%d日%H:%M ’)
3 
4 # 時間轉換字元串:-strftime
5 dt.strftime('%Y-%m-%d‘)

 

獲取新聞內文:

  檢查其所屬類後按照上面的 select 獲取新聞內文,獲取的內容為list形式,可用for迴圈將內容去除標簽後加入到自己創建的的list中(如article = [])

  * 其中可以用 ‘ \n ’.join( article ) 將article列表中的每一項用換行符‘ \n ’分隔開;

1 # 獲取單篇新聞內容
2 article = []
3 for p in soup.select('.article p'):
4     article.append(p.text.strip())
5 print('\n'.join(article))

  上面獲取單篇新聞的代碼可用一行完成:

1 # 一行完成上面獲取新聞內容的代碼
2 print('\n'.join([p.text.strip() for p in soup.select('.article p')]))

 

獲取評論數量:(在獲取評論數量時會發現評論是用js的形式發送給瀏覽器的,所以要先把獲取的內容轉化為json格式讀取python字典

1 # 取得評論數的數量
2 import requests
3 import json
4 comment = requests.get('http://comment5.news.sina.com.cn/page/info?version=1&format=js&c\
5 hannel=gn&newsid=comos-fyihrmf3218511&group=&compress=0&ie=utf-8&oe=utf-8&page=1&page_size=20')  # 從評論地址獲取相關內容
6 comment.encoding = 'utf-8'
7 jd = json.loads(comment.text.strip('var data='))
8 jd['result']['count']['total']

 

完整代碼(以獲取新浪新聞為例)

 1 # 獲取新聞的標題,內容,時間和評論數
 2 import requests
 3 from bs4 import BeautifulSoup
 4 from datetime import datetime
 5 import re
 6 import json
 7 import pandas
 8 
 9 def getNewsdetial(newsurl):
10     res = requests.get(newsurl)
11     res.encoding = 'utf-8'
12     soup = BeautifulSoup(res.text,'html.parser')
13     newsTitle = soup.select('.page-header h1')[0].text.strip()
14     nt = datetime.strptime(soup.select('.time-source')[0].contents[0].strip(),'%Y年%m月%d日%H:%M')
15     newsTime = datetime.strftime(nt,'%Y-%m-%d %H:%M')
16     newsArticle = getnewsArticle(soup.select('.article p'))
17     newsAuthor = newsArticle[-1]
18     return newsTitle,newsTime,newsArticle,newsAuthor
19 def getnewsArticle(news):
20     newsArticle = []
21     for p in news:
22          newsArticle.append(p.text.strip())
23     return newsArticle
24 
25 # 獲取評論數量
26 
27 def getCommentCount(newsurl):
28     m = re.search('doc-i(.+).shtml',newsurl)
29     newsid = m.group(1)
30     commenturl = 'http://comment5.news.sina.com.cn/page/info?version=1&format=js&channel=gn&newsid=comos-{}&group=&compress=0&ie=utf-8&oe=utf-8&page=1&page_size=20'
31     comment = requests.get(commenturl.format(newsid))   #將要修改的地方換成大括弧,並用format將newsid放入大括弧的位置
32     jd = json.loads(comment.text.lstrip('var data='))
33     return jd['result']['count']['total']
34 
35 
36 def getNewsLinkUrl():
37 #     得到非同步載入的新聞地址(即獲得所有分頁新聞地址)
38     urlFormat = 'http://api.roll.news.sina.com.cn/zt_list?channel=news&cat_1=gnxw&cat_2==gdxw1||=gatxw||=zs-pl||=mtjj&level==1||=2&show_ext=1&show_all=1&show_num=22&tag=1&format=json&page={}&callback=newsloadercallback&_=1501000415111'
39     url = []
40     for i in range(1,10):
41         res = requests.get(urlFormat.format(i))
42         jd = json.loads(res.text.lstrip('  newsloadercallback(').rstrip(');'))
43         url.extend(getUrl(jd))     #entend和append的區別
44     return url
45 
46 def getUrl(jd):
47 #     獲取每一分頁的新聞地址
48     url = []
49     for i in jd['result']['data']:
50         url.append(i['url'])
51     return url
52 
53 # 取得新聞時間,編輯,內容,標題,評論數量並整合在total_2中
54 def getNewsDetial():
55     title_all = []
56     author_all = []
57     commentCount_all = []
58     article_all = []
59     time_all = []
60     url_all = getNewsLinkUrl()
61     for url in url_all:
62         title_all.append(getNewsdetial(url)[0])
63         time_all.append(getNewsdetial(url)[1])
64         article_all.append(getNewsdetial(url)[2])
65         author_all.append(getNewsdetial(url)[3])
66         commentCount_all.append(getCommentCount(url))
67     total_2 = {'a_title':title_all,'b_article':article_all,'c_commentCount':commentCount_all,'d_time':time_all,'e_editor':author_all}
68     return total_2
69 
70 # ( 運行起始點 )用pandas模塊處理數據並轉化為excel文檔
71 
72 df = pandas.DataFrame(getNewsDetial())
73 df.to_excel('news2.xlsx')

 

存儲的excel文檔如下:

 

 

TIPS:

問題:在jupyter notebook導入pandas時可能會出現導入錯誤

解決:不要用命令行打開jupyter notebook,直接找到軟體打開或者在Anocanda Navigator中打開

2017-07-29  21:49:37


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 類的特殊成員方法 1. __doc__ 表示類的描述信息 __doc__是用來列印類的描述信息。就是類的註釋。 2.__module__和__class__ __module__表示當前操作的對象在那個模塊 __class__ 表示當前操作的對象的類是什麼 3. __init__ 構造方法,通過類創 ...
  • 15套java架構師、集群、高可用、高可擴 展、高性能、高併發、性能優化、Spring boot、Redis、ActiveMQ、Nginx、Mycat、Netty、Jvm大型分佈 式項目實戰視頻教程 視頻課程包含: 高級Java架構師包含:Spring boot、Spring cloud、Dubbo ...
  • ReentrantLock是Java併發包中提供的一個可重入的互斥鎖。ReentrantLock和synchronized在基本用法,行為語義上都是類似的,同樣都具有可重入性。只不過相比原生的Synchronized,ReentrantLock增加了一些高級的擴展功能,比如它可以實現公平鎖,同時也可 ...
  • 通過python 來實現這樣一個簡單的爬蟲功能,把我們想要的圖片爬取到本地。(Python版本為3.6.0) 一.獲取整個頁面數據 說明: 向getHtml()函數傳遞一個網址,就可以把整個頁面下載下來. urllib.request 模塊提供了讀取web頁面數據的介面,我們可以像讀取本地文件一樣讀 ...
  • mybatis 是apache下的一個面向sql編程的半自動化的ORM持久層的框架。特點:面向sql編程,達到高性能的使用目的。 下麵是簡單使用 現導入jar包,只有mybatis和資料庫驅動包(這裡用的是mysql的驅動包)是必須的,其餘是日誌需要的包 db.properties配置連接池的配置文 ...
  • 靜態方法(@staticmethod) 通過@staticmethod裝飾器即可把其裝飾的方法變為一個靜態方法,什麼是靜態方法呢?其實不難理解,普通的方法,可以在實例化後直接調用,並且在方法里可以通過self.調用實例變數或類變數,但靜態方法是不可以訪問實例變數或類變數的,一個不能訪問實例變數和類變 ...
  • 最近的一次面試中,被問到橋接模式,以前呢並沒有很仔細的研究過這個設計模式,藉此機會剖析一下。 先給出自己對這個模式理解後的源碼: 那麼設個設計模式的應用場景呢? 從參考資料1中的解釋是,數據機Modem,舊版OldModem採用的的dial和answer的模式,新版採用send和receive的 ...
  • 首先,這是我對自己的需求而使用的邏輯,若有可以完美的地方方便告訴下小白。 MAVEN 1、前端頁面,偽非同步(頁面不刷新) 為什麼不用ajax呢? JQuery的ajax函數的返回類型只有xml、text、json、html等類型,沒有“流”類型。所以就用js做個form表單請求 上代碼 2、在工具包 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...