一個簡單的python爬蟲程式

来源:https://www.cnblogs.com/josephji/archive/2018/04/17/8859249.html
-Advertisement-
Play Games

`python 網路爬蟲` 概述 這是一個簡單的python爬蟲程式,僅用作技術學習與交流,主要是通過一個簡單的實際案例來對網路爬蟲有個基礎的認識。 什麼是網路爬蟲 簡單的講,網路爬蟲就是模擬人訪問web站點的行為來獲取有價值的數據。專業的解釋: "百度百科" 分析爬蟲需求 確定目標 爬取豆瓣熱度在 ...


python|網路爬蟲

概述

這是一個簡單的python爬蟲程式,僅用作技術學習與交流,主要是通過一個簡單的實際案例來對網路爬蟲有個基礎的認識。

什麼是網路爬蟲

簡單的講,網路爬蟲就是模擬人訪問web站點的行為來獲取有價值的數據。專業的解釋:百度百科

分析爬蟲需求

確定目標

爬取豆瓣熱度在Top100以內的電影的一些信息,包括電影的名稱、豆瓣評分、導演、編劇、主演、類型、製片國家/地區、語言、上映日期、片長、IMDb鏈接等信息。

分析目標
  1. 藉助工具分析目標網頁
    首先,我們打開豆瓣電影·熱門電影,會發現頁面總共20部電影,但當查看頁面源代碼當時候,在源代碼中根本找不到這些電影當信息。這是為什麼呢?原來豆瓣在這裡是通過ajax技術獲取電影信息,再動態的將數據載入到頁面中的。這就需要藉助Chrome的開發者工具,先找到獲取電影信息的API。
    查找電影信息API


    然後對電影詳情頁進行分析

    詳情頁分析

思路分析

思路

具體實現

開發環境

python3.6

pycharm

主要依賴庫

urllib -- 基礎性的網路相關操作

lxml -- 通過xpath語法解析HTML頁面

json -- 對通過API獲取的JSON數據進行操作

re -- 正則操作

代碼實現
from urllib import request
from lxml import etree
import json
import re
import ssl


# 全局取消證書驗證
ssl._create_default_https_context = ssl._create_unverified_context


def get_headers():
    """
    返回請求頭信息
    :return:
    """
    headers = {
        'User-Agent': "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) "
                      "AppleWebKit/537.36 (KHTML, like Gecko) "
                      "Chrome/65.0.3325.181 Safari/537.36"
    }
    return headers


def get_url_content(url):
    """
    獲取指定url的請求內容
    :param url:
    :return:
    """
    content = ''
    headers = get_headers()
    res = request.Request(url, headers=headers)
    try:
        resp = request.urlopen(res, timeout=10)
        content = resp.read().decode('utf-8')
    except Exception as e:
        print('exception: %s' % e)
    return content


def parse_content(content):
    """
    解析網頁
    :param content:
    :return:
    """
    movie = {}
    html = etree.HTML(content)
    try:
        info = html.xpath("//div[@id='info']")[0]
        movie['director'] = info.xpath("./span[1]/span[2]/a/text()")[0]
        movie['screenwriter'] = info.xpath("./span[2]/span[2]/a/text()")[0]
        movie['actors'] = '/'.join(info.xpath("./span[3]/span[2]/a/text()"))
        movie['type'] = '/'.join(info.xpath("./span[@property='v:genre']/"
                                            "text()"))
        movie['initialReleaseDate'] = '/'.\
            join(info.xpath(".//span[@property='v:initialReleaseDate']/text()"))
        movie['runtime'] = \
            info.xpath(".//span[@property='v:runtime']/text()")[0]

        def str_strip(s):
            return s.strip()

        def re_parse(key, regex):
            ret = re.search(regex, content)
            movie[key] = str_strip(ret[1]) if ret else ''

        re_parse('region', r'<span class="pl">製片國家/地區:</span>(.*?)<br/>')
        re_parse('language', r'<span class="pl">語言:</span>(.*?)<br/>')
        re_parse('imdb', r'<span class="pl">IMDb鏈接:</span> <a href="(.*?)" '
                         r'target="_blank" rel="nofollow">')
    except Exception as e:
        print('解析異常: %s' % e)
    return movie


def spider():
    """
    爬取豆瓣前100部熱門電影
    :return:
    """
    recommend_moives = []
    movie_api = 'https://movie.douban.com/j/search_subjects?' \
                'type=movie&tag=%E7%83%AD%E9%97%A8&sort=recommend' \
                '&page_limit=100&page_start=0'
    content = get_url_content(movie_api)
    json_dict = json.loads(content)
    subjects = json_dict['subjects']
    for subject in subjects:
        content = get_url_content(subject['url'])
        movie = parse_content(content)
        movie['title'] = subject['title']
        movie['rate'] = subject['rate']
        recommend_moives.append(movie)
        print(len(recommend_moives))
    print(recommend_moives)


if __name__ == '__main__':
    spider()

效果

抓取結果

總結

本文較詳細的闡述了一個爬蟲從需求->分析->實現的過程,並給出了具體的代碼實現。通過對本文的學習,我們可以瞭解到網路爬蟲的一些基本的知識,以及python的一些基本庫的使用方法。接下來我會使用一些高級些的網路操作相關的庫以及對抓取到的數據做個存儲的方式,來更深層次的理解python網路爬蟲。

特別聲明
1. 本文涉及到的豆瓣網是國內知名網站,若有侵權之處,請告知。
2. 本文屬作者原創,轉載請標明出處;未經允許,不得用於商業用途。
3. 本文只是用作網路爬蟲技術學習交流,讀者涉及到的任何侵權問題,與本文作者無關。

筆者對應的簡書文章


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

-Advertisement-
Play Games
更多相關文章
  • 一、概念 享元模式是對象的結構模式,它以共用的方式高效的支持大量的細粒度對象,減少對象的數量,並達到節約記憶體的目的。 享元對象能夠做到共用的關鍵,主要是區分了內部狀態和外部狀態,內部狀態是對象是在建立時就已確定了,且它不隨環境的改變而有所不同,所以這些內部狀態就可以共用,而外部狀態是會隨著環境的變化 ...
  • 開發部署 Spring Cloud 微服務框架,需要先確定 Spring Cloud 的相關環境版本,主要包含:Spring Cloud、Spring Cloud Netflix、JDK、JRE、Java Version等相關版本,以及環境的配置。 現在最新版本 Java 10、Spring Boo ...
  • layout: post title: 2016 03 22 信息系統實踐手記3 按業務展開的代碼剝離 key: 20160322 tags: 測試 重構 方面編程 優化 持續集成 master PO 開發 剝離 modify_date: 2016 03 22 信息系統實踐手記3 按業務展開的代碼剝 ...
  • 在面向對象的設計中,我們應當遵循以下六大原則,只有掌握了這些原則,才能更好的理解設計模式。 1:單一職責原則(Single Responsibility Principle 簡稱 :SRP) : 就一個類而言,應該僅有一個引起他變化的原因 2:介面隔離原則(Interface Segregation ...
  • layout: post title: 2016 03 11 信息系統實踐手記2 客戶端啟動速度調優思路 key: 20160311 tags: 客戶端 調優 測試 伺服器 GIS WPF 模塊 壓力 瓶頸 modify_date: 2016 03 11 信息系統實踐手記2 客戶端啟動速度調優思路 ...
  • 手把手教你寫網路爬蟲(3) 作者:拓海 摘要:從零開始寫爬蟲,初學者的速成指南! 封面: 介紹 大家好!我們從今天開始學習開源爬蟲框架Scrapy,如果你看過《手把手》系列的前兩篇,那麼今天的內容就非常容易理解了。細心的讀者也許會有疑問,為什麼不學出身名門的Apache頂級項目Nutch,或者人氣飆 ...
  • 上一篇詳細的分析了獨占模式下如何對線程進行處理:簡單的總結是Java面向用戶提供了鎖的機制,後面的實現使用了一個同步隊列,由於隊列具有先進先出的特點,把每個線程都構造成為隊列中的節點,每個節點定義一個狀態值,符合狀態的節點(線程)才可以有執行的機會,執行完釋放,後面的線程只能是等待著前面的執行結果進 ...
  • 問題 之前一直用的 Laravel 5.4,資料庫也是直接寫 sql 的,感覺可定製性更強,順便鍛煉下 sql。這次改用了 Laravel 5.5,索性用遷移建庫試試,結果報錯如下: SQLSTATE[HY000]: General error: 1215 Cannot add foreign ke ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...