Python爬蟲學習記錄【內附代碼、詳細步驟】

来源:http://www.cnblogs.com/JennyZhang-sharing/archive/2017/12/07/7998352.html
-Advertisement-
Play Games

編寫Python網路爬蟲,爬取新浪新聞首頁新聞列表。有代碼,有詳細步驟,有截圖,歡迎嘗試! ...


引言:

        昨天在網易雲課堂自學了《Python網路爬蟲實戰》,視頻鏈接 老師講的很清晰,跟著實踐一遍就能掌握爬蟲基礎了,強烈推薦!

        另外,在網上看到一位學友整理的課程記錄,非常詳細,可以優先參考學習。傳送門:請點擊

        本篇文章是自己同步跟著視頻學習的記錄,歡迎閱讀~~~

 

實驗:新浪新聞首頁爬蟲實踐

http://news.sina.com.cn/china/

一、準備

  • 瀏覽器內建的開發人員工具(以Chrome為例)

  • Python3 requests 庫

  • Python3 BeautifulSoup4 庫(註意,BeautifulSoup4和BeautifulSoup是不一樣的)

  • jupyter notebook

二、抓取前的分析

以Chrome為例,抓取前的分析步驟如圖:

  1. F12進入到開發者工具;
  2. 點擊Network
  3. 刷新頁面;(按F5)
  4. 找到Doc
  5. 找到左邊Name這一欄的第一個(需要爬去的鏈接90%的情況都是第一個);
  6. 點擊右邊的Headers
  7. 找到請求的URL和請求方式。

 三、開始撰寫第一隻網路爬蟲

Requests庫

  • 網路資源擷取套件
  • 改善Urllib2的缺點,讓使用者以最簡單的方式獲取網路資源
  • 可以使用REST操作存取網路資源

jupyter

使用jupyter來抓取網頁並列印在瀏覽器中,再按Ctrl-F查找對應的內容,以確定我們要爬去的內容在該網頁中。

測試示例:

1 import requests
2 res = requests.get('http://www.sina.com.cn/')
3 res.encoding = 'utf-8'
4 print(res.text)

四、用BeautifulSoup4剖析網頁元素

測試示例:

 1 from bs4 import BeautifulSoup
 2 html_sample = ' \
 3 <html> \
 4 <body> \
 5 <h1 id="title">Hello World</h1> \
 6 <a href="#" class="link">This is link1</a> \
 7 <a href="# link2" class="link">This is link2</a> \
 8 </body> \
 9 </html>'
10 
11 soup = BeautifulSoup(html_sample, 'lxml')
12 print(soup.text)

五、BeautifulSoup基礎操作

使用select找出含有h1標簽的元素

soup = BeautifulSoup(html_sample)
header = soup.select('h1')
print(header)
print(header[0])
print(header[0].text)

使用select找出含有a的標簽

soup = BeautifulSoup(html_sample, 'lxml')
alink = soup.select('a')
print(alink)
for link in alink:
    print(link)
    print(link.txt)

使用select找出所有id為title的元素(id前面需要加#)

alink = soup.select('#title')
print(alink)

使用select找出所有class為link的元素(class前面需要加.)

soup = BeautifulSoup(html_sample)
for link in soup.select('.link'):
    print(link)

使用select找出所有a tag的href鏈接

alinks = soup.select('a')
for link in alinks:
    print(link['href']) # 原理:會把標簽的屬性包裝成字典

六、觀察如何抓取新浪新聞信息

關鍵在於尋找CSS定位

  • Chrome開發人員工具(進入開發人員工具後,左上角點選元素觀測,就可以看到了)

    Chrome尋找元素定位.png

  • Firefox開發人員工具
  • InfoLite(需FQ)

七、製作新浪新聞網路爬蟲

抓取時間、標題、內容

import requests
from bs4 import BeautifulSoup

res = requests.get('http://news.sina.com.cn/china')
res.encoding = 'utf-8'
soup = BeautifulSoup(res.text, 'lxml')

for news in soup.select('.news-item'):
    if (len(news.select('h2')) > 0):
        h2 = news.select('h2')[0].text
        time = news.select('.time')[0].text
        a = news.select('a')[0]['href']
        print(time, h2, a)

抓取新聞內文頁面

新聞網址為:http://news.sina.com.cn/o/2017-12-06/doc-ifypnyqi1126795.shtml

內文資料信息說明圖.png

獲取新聞內文標題、時間、來源

其中涉及時間和字元串轉換

from datetime import datetime

// 字元串轉時間 --- strptime
dt = datetime.strptime(timesource, '%Y年%m月%d日%H:%M')

// 時間轉字元串 --- strftime
dt.strftime(%Y-%m-%d)

整理新聞內文、獲取編輯名稱

整理新聞內文步驟:

1、抓取;

2、獲取段落;

3、去掉最後一行的編輯者信息;

4、去掉空格;

5、將空格替換成\n,這裡可以自行替換成各種其他形式;

最終簡寫為一句話。

抓取新聞評論數

解釋:

評論是是通過JS代碼傳過來的;既然是JS,那麼通過AJAX傳過來的概率很高,於是點到XHR中看,但是發現Response中沒有出現總評論數2然後就只能去JS裡面了,地毯式搜索,找哪個Response里出現了總評論數2,終於找到了。

 

找到鏈接和請求方式

今天補的截圖,評論數實時增加,請不要覺得奇怪 ^_^

 然後就可以擼碼了。

 

解釋:

var data={......}看著很像是個json串,去掉var data=,使其變為json串。

可以看到,jd串中就是評論的信息了。

回到Chrome開發工具中,瀏覽評論數量。

 獲取新聞標識符(新聞ID)

方式1:切割法

# 取得新聞編號
newsurl = 'http://news.sina.com.cn/o/2017-12-06/doc-ifypnyqi1126795.shtml'
newsid = newsurl.split('/')[-1].rstrip('.shtml').lstrip('doc-i')
newsid

方式2:正則表達式

import re
m = re.search('doc-i(.*).shtml', newsurl)
newsid = m.group(1)
newsid

八、建立獲取評論數函數

做一個總整理,把剛剛取得評論數的方法整理成一個函數。之後有新聞網頁的鏈接丟進來,可以通過這個函式去取得它的總評論數。

 

 九、建立新聞內文信息抽取函數

 十、從列錶鏈接中取出每篇新聞內容

如果Doc下麵沒有我們想要找的東西,那麼就有理由懷疑,這個網頁產生資料的方式,是通過非同步的方式產生的。因此需要去XHRJS下麵去找。

有時候會發現非同步方式的資料XHR下沒有,而是在JS下麵。這是因為這些資料會被JS的函式包裝,Chrome的開發者工具認為這是JS文件,因此就放到了JS下麵。

JS中找到我們感興趣的資料,然後點擊Preview預覽,如果確定是我們要找的,就可以去Headers中查看Request URLRequest Method了。

一般JS中的第一個可能就是我們要找的,要特別留意第一個。

1、選擇Network標簽

2、點選JS

3、找到頁面鏈接page=2

處理分頁鏈接

註意頭尾,需要去掉頭和尾,將其變成標準的json格式。

十一、建立剖析清單鏈接函數

將前面的步驟整理一下,封裝到一個函式中。

def parseListLinks(url):
    newsdetails = []
    res = requests.get(url)
    jd = json.loads(res.text.lstrip('newsloadercallback()').rstrip(');'))
    for ent in jd['result']['data']:
        newsdetails.append(getNewsDetail(ent['url']))
    return newsdetails

十二、使用for迴圈產生多頁鏈接

十三、批次抓取每頁新聞內文

 十四、 使用pandas整理數據

Python for Data Analysis

  • 源於R
  • Table-Like格式
  • 提供高效能、簡易使用的資料格式(Data Frame)讓使用者可以快速操作及分析資料

十五、保存數據到資料庫

 

 

持續戰鬥到這裡,第一隻網路爬蟲終於完成。看著最終的結果,很有成就感啊!^_^

大家感興趣的可以試一試,歡迎討論交流~~~

如果覺得文章有用,請隨手點贊,感謝大家的支持!

特別贈送:GitHub代碼傳送門 

感謝大家耐心地閱讀,如果能對大家有一點點幫助,歡迎點亮我的GitHub星標,謝謝~~~


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

-Advertisement-
Play Games
更多相關文章
  • ArrayList和LinkedList是常用的兩種存儲結構,那麼它們有哪些區別呢?這裡簡單給出一部分。 1、ArrayList和LinkedList可想從名字分析,它們一個是Array(動態數組)的數據結構,一個是Link(鏈表)的數據結構,此外,它們兩個都是對List介面的實現。 前者是數組隊列 ...
  • CURL是一個非常強大的開源庫,支持很多協議,包括HTTP、FTP、TELNET等,我們使用它來發送HTTP請求。它給我 們帶來的好處是可以通過靈活的選項設置不同的HTTP協議參數,並且支持HTTPS。CURL可以根據URL首碼是“HTTP” 還是“HTTPS”自動選擇是否加密發送內容。 使用CUR ...
  • ODBC DataSource添加Access資料庫 Java JDBC訪問Access資料庫 以下為封裝好的DBApplication類 ...
  • foreach遍歷查詢mysql中的tinyint欄位時一直查都是各種0,false,null 發現原來是實體類中的變數名和mysql中的列名不一樣出的bug 所以說列名和實體類中的相關變數名是要保持一致的。 ...
  • 牛刀小試,MMP;嘿嘿,如有轉載,請聲明地址http://www.cnblogs.com/jinmoon/; 圖形類,點類,三角形類,汽車類,介面;運用繼承,抽象類,介面,多態;已知點類三點,輸出三點;三角形類周長,面積;汽車標誌; public class Test { public static ...
  • (自己的筆記)以一個Admin類作為說明1.首先@Entity 註解將一個類聲明為實體Bean@Table 映射數句庫表2.創建表的主鍵@Id用來註冊主屬性@GeneratedValue來說明主鍵的自增長3.創建列@Column 註解將屬性映射到列@Column( name="columnName"... ...
  • 首先我們要知道if的意思,if是如果的意思,那麼有如果就一定會有否則,那麼else就來了。 然後就是if的後面有一個()是英文的括弧,然後括弧裡面是條件,然後大括弧最後裡面是判斷的事情,以及不成立的時候所得的結果。如下圖: if(condition){ } if(condition){ }else{ ...
  • 1 # coding:utf-8 2 import os 3 # 聲明一個空列表存儲學員的姓名 4 member_list = [] 5 # 讀取本地文件生數據,將本地數據添加至member_list 中 即可沒保證第二次運行member_list 6 if os.path.exists('stud... ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...