爬蟲基本介紹 && python3 爬蟲爬取網易新聞排行榜

爬蟲基本介紹


1. 什麼是爬蟲?

爬蟲是請求⽹網站並提取數據的⾃自動化程序html

2. 爬蟲的基本流程

  1. 發起請求
    經過HTTP庫向目標站點發起請求,即發送一個Request,請求能夠包含額外的headers等信息,等待服務器器響應。
  2. 解析內容
    若是服務器能正常響應,會獲得一個Response,Response的內容便是所要獲取的頁面內容,類型可能有HTML,Json字符串,二進制數據(如圖片視頻)等類型。
  3. 獲取響應內容
    獲得的內容多是HTML,能夠用正則表達式、網頁解析庫進行解析。多是Json,能夠直接轉爲Json對象解析,多是二進制數據,能夠作保存或者進一步的處理。
  4. 保存數據
    保存形式多樣,能夠存爲文本,也能夠保存至數據庫,或者保存特定格式的文件。

3. 什麼是Request和Response?

  • 瀏覽器就發送消息給該網址所在的服務器,這個過程叫作HTTP Request。
  • 服務器收到瀏覽器發送的消息後,可以根據瀏覽器發送消息的內容,作相應處理,而後把消息回傳給瀏覽器。這個過程叫作HTTP Response。
  • 瀏覽器收到服務器的Response信息後,會對信息進行相應處理,而後展現。

3.1 Request中包含什麼?

Request和Response

  • 請求方式:主要有GET、POST兩種類型,另外還有HEAD、PUT、DELETE、OPTIONS等。
  • 請求頭:包含請求時的頭部信息,如User-Agent、Host、Cookies等信息。
  • 請求URL:URL全稱統一資源定位符,如一個網頁文檔、一張圖片、一個視頻等均可以用URL惟一來肯定。
  • 請求體:請求時額外攜帶的數據如表單提交時的表單數據

3.2 Response中包含什麼?

  • 響應狀態:有多種響應狀態,如200表明成功、301跳轉、404找不到頁面、502服務器錯誤
  • 響應頭:如內容類型、內容長度、服務器信息、設置Cookie等等。
  • 響應體:最主要的部分,包含了請求資源的內容,如網頁HTML、圖片二進制數據等。

4. 爬蟲能夠抓取怎樣的數據?

  • 網頁文本:如HTML文檔、Json格式文本等。
  • 圖片:獲取到的是二進制文件,保存爲圖片格式。
  • 視頻:同爲二進制文件,保存爲視頻格式便可。
  • 其它:只要是能請求到的,都能獲取。

5. 怎樣來解析?

  • 直接處理
  • Json解析
  • 正則表達式
  • BeautifulSoup
  • PyQuery
  • Xpath

6. 怎樣保存數據?

  • 文本:純文本、Json、Xml等。
  • 關係型數據庫:如MySQL、Oracle、SQL Server等具備結構化表結構形式存儲。
  • 非關係型數據庫:如MongoDB、Redis等Key-Value形式存儲。
  • 二進制文件:如圖片、視頻、音頻等直接保存成特定格式便可。

爬蟲爬取網易新聞排行榜。


1. 肯定目標

通過討論,分析,對比各個新聞門戶網站的排行榜,最終選取了內容正規、不良信息少、廣告少的網易新聞排行榜。每一個整點爬取一次,選取點擊率最高的前20條熱門新聞。即紅框所選內容。
網易新聞排行榜python

2. 分析目標網頁

目標網頁:http://news.163.com/special/0001386F/rank_news.html
經過分析網頁源代碼得知,這個網頁排行榜並非經過JavaScript動態加載生成。因此網頁爬取後能夠直接處理,簡單利用BeautifulSoup + requests庫便可實現。mysql

3. 實現過程

3.1 請求目標網頁並存儲網頁源文件

# 導入相應的包
from bs4 import BeautifulSoup
import requests
import re
import datetime
from connect_mysql import *
# 獲取當前時間並指定格式爲2018041018
time = datetime.datetime.now().strftime("%Y%m%d%H")
url = r'http://news.163.com/special/0001386F/rank_news.html'
# 模擬真實瀏覽器進行訪問
headers = {'User-Agent':
               'Mozilla/5.0 (Windows NT 10.0; WOW64) '
               'AppleWebKit/537.36 (KHTML, like Gecko) '
               'Chrome/55.0.2883.87 Safari/537.36'}
response = requests.get(url, headers=headers)
page_html = response.text

3.2 將獲取到的內容轉換成BeautifulSoup格式,並將html.parser做爲解析器

soup = BeautifulSoup(page_html, 'html.parser')

3.3 對soup進行分析處理

首先經過分析網站結構得知,咱們須要的數據在class = tabContents active的div下的全部a標籤中,而這個div又嵌套在class = area-half left的div中。因此咱們寫以下代碼,從網頁源代碼中找到全部符合要求的標題,限制20條。web

titles = soup.find('div', 'area-half left').find('div', 'tabContents active').find_all('a', limit=20)

僅需一行代碼,咱們就已經獲取到了咱們須要的部分數據。接下來繼續獲取新的對咱們有用的數據,並存放到數據庫。正則表達式

經過開發者調試工具分析網頁源代碼

3.4 對3.3的結果進一步處理

因爲網頁標題顯示不全,因此上一步爬取的標題,部分不完整。因此咱們須要進一步爬取,步驟和上述幾個操做相似,爬取新聞連接,新聞內容,新聞完整標題。這三個內容,並調用本身寫的方法,將數據存放到數據庫。並用re庫對內容進行簡單處理(去除\n\t\r ),具體實現以下。sql

for title in titles:
    ''' news_url:新聞連接 news_html:新聞頁網頁源代碼 '''
    news_url = (str(title.get('href')))
    news_response = requests.get(news_url, headers=headers)
    news_html = news_response.text
    # 將獲取到的內容轉換成BeautifulSoup格式,並將html.parser做爲解析器
    news_soup = BeautifulSoup(news_html, 'html.parser')
    # 從網頁源代碼中找到屬於post_text類的div,並將全部p標籤內容存入列表news_contents
    if news_soup.find('div', 'post_text') is None:  # 若是網頁丟失,跳出本次循環
        continue
    news_title = news_soup.find('h1')
    contents = news_soup.find('div', 'post_text').find_all('p')
    news_contents = []
    for content in contents:
        if content.string is not None:
            #去掉特殊字符
            news_contents.append(re.sub('[\r\n\t ]', '', str(content.string)))
    #字符串拼接
    news_contents = ''.join(news_contents)
    # 將爬取到的數據存入數據庫
    insert_wangyinews_into_mysql(wangyi_news, str(news_title.string), news_url, news_contents, time)

這樣,一個簡單的爬蟲就完成了,不要小看這幾十行代碼,它們在本項目中發揮了巨大的做用。數據庫

本文所用開發環境:
anaconda 5.1
pycharm瀏覽器

本文第一部分是崔慶才老師的python3網絡爬蟲視頻教程的筆記:
課程連接:https://cuiqingcai.com/4320.html
崔老師的課程對我有很大的幫助,再次感謝。服務器

相關文章
相關標籤/搜索