1. 程式人生 > >python-入門的第一個爬蟲例子

python-入門的第一個爬蟲例子

前言:

此文為大家入門爬蟲來做一次簡單的例子,讓大家更直觀的來了解爬蟲。
本次我們利用 Requests 和正則表示式來抓取豆瓣電影的相關內容。

一、本次目標:

二、準備工作

確保已經正確安裝 Requests 庫,無論是 Windows、Linux 還是 Mac,都可以通過 Pip 這個包管理工具來安裝。

安裝命令:pip3 install requests
正則表示式相關教程見:正則表示式總結版正則表示式

三、抓取分析

抓取的目標站點為:https://movie.douban.com/cinema/nowplaying/beijing/,開啟之後便可以檢視到正在上映的電影資訊,如圖所示:20180512142639_result.png頁面中顯示的有效資訊有影片名稱、評分、圖片等資訊。這樣我們獲取該頁面結果之後再用正則表示式提取出相關資訊就可以得到所有正在上映的電影資訊了。

四、抓取頁面原始碼

接下來我們用程式碼實現抓取頁面原始碼過程,首先實現一個 get_page() 方法,傳入 url 引數,然後將抓取的頁面結果返回,然後再實現一個 main() 方法呼叫一下,初步程式碼實現如下:
def get_page(url): try: response = requests.get(url) if response.status_code == 200: return response.text return None except RequestException: return None def main(): url = "https://movie.douban.com/cinema/nowplaying/beijing/" html = get_page(url)


----

五、正則提取電影資訊

接下來我們回到網頁看一下頁面的真實原始碼,在開發者工具中 Network 監聽,然後檢視一下原始碼,如圖所示:20180512142636_result.png注意這裡不要在 Elements 選項卡直接檢視原始碼,此處的原始碼可能經過 JavaScript 的操作而和原始請求的不同,我們需要從 Network 選項卡部分檢視原始請求得到的原始碼。
檢視其中的一個條目的原始碼如圖所示:20180512143404_result.png可以看到一部電影資訊對應的原始碼是一個 li 節點,我們用正則表示式來提取這裡面的一些電影資訊,首先我們需要提取它的電影名稱資訊,而它的電影名稱資訊是在 class 為 "list-item"的節點後,所以這裡利用非貪婪匹配來提取data-title屬性的資訊,正則表示式寫為:
<li.*?list-item.*?data-title="(.*?)".*?>


使用相同判斷方法來提取data-score屬性的資訊,正則表示式寫為:

<li.*?list-item.*?data-title="(.*?)".*?data-score="(.*?)".*?>

隨後我們需要提取電影的圖片,可以看到在a節點內部有img節點,該節點的src屬性是圖片的連結,所以在這裡提取img節點的src屬性,所以正則可以改寫如下:

<li.*?list-item.*?data-title="(.*?)".*?data-score="(.*?)".*?>.*?<img.*?src="(.*?)".*?/>

這樣我們一個正則表示式可以匹配一個電影的結果,裡面匹配了3個資訊,接下來我們通過呼叫 findall() 方法提取出所有的內容,實現一個 parse_page() 方法如下:

def parse_page(html):
    pattern = re.compile('<li.*?list-item.*?data-title="(.*?)".*?data-score="(.*?)".*?>.*?<img.*?src="(.*?)".*?/>', re.S)
    items = re.findall(pattern, html)
    for item in items:
        yield{
            'title': item[0],
            'score': item[1],
            'image': item[2],
        }

這樣我們就可以成功提取出電影的圖片、標題、評分內容了,並把它賦值為一個個的字典,形成結構化資料,執行結果如下:

{'image': 'https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2517753454.jpg', 'title': '復仇者聯盟3:無限戰爭', 'score': '8.6'}
{'image': 'https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2517769368.jpg', 'title': '小公主艾薇拉與神祕王國', 'score': '0'}
{'image': 'https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2519994468.jpg', 'title': '後來的我們', 'score': '5.8'}
{'image': 'https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2520200484.jpg', 'title': '我是你媽', 'score': '5.1'}
{'image': 'https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2520197352.jpg', 'title': '戰犬瑞克斯', 'score': '7.0'}

到此為止我們就成功提取了此頁的電影資訊。

六、寫入檔案

隨後我們將提取的結果寫入檔案,在這裡直接寫入到一個文字檔案中,通過 json 庫的 dumps() 方法實現字典的序列化,並指定 ensure_ascii 引數為 False,這樣可以保證輸出的結果是中文形式而不是 Unicode 編碼,程式碼實現如下:

def write_to_file(content):
    with open('xiaoxi.txt', 'a', encoding='utf-8')as f:
        print(type(json.dumps(content)))
        f.write(json.dumps(content,ensure_ascii=False))

通過呼叫 write_to_json() 方法即可實現將字典寫入到文字檔案的過程,此處的 content 引數就是一部電影的提取結果,是一個字典。

七、整合程式碼

到此為止,我們 的爬蟲就全部完成了,再稍微整理一下,完整的程式碼如下:原始碼見git

# -*- coding: utf-8 -*-
# @Time    : 2018/5/12 上午11:37
# @Author  : xiaoxi
# @File    : test.py
import json
import re
import requests
from requests import RequestException

def get_page(url):
    try:
        response = requests.get(url)
        if response.status_code == 200:
            return response.text
        return None
    except RequestException:
        return None

def parse_page(html):
    pattern = re.compile('<li.*?list-item.*?data-title="(.*?)".*?data-score="(.*?)".*?>.*?<img.*?src="(.*?)".*?/>', re.S)
    items = re.findall(pattern, html)
    for item in items:
        yield{
            'title': item[0],
            'score': item[1],
            'image': item[2],
        }

def write_to_file(content):
    with open('xiaoxi.txt', 'a', encoding='utf-8')as f:
        # print(type(json.dumps(content)))
        f.write(json.dumps(content,ensure_ascii=False))

def main():
    url = "https://movie.douban.com/cinema/nowplaying/beijing/"
    html = get_page(url)
    for item in parse_page(html):
        print(item)
        write_to_file(item)

if __name__ == '__main__':
    main()

執行之後,可以看到電影資訊也已全部儲存到了文字檔案中,大功告成!

八、執行結果

最後我們執行一下程式碼,類似的輸出結果如下:

{'image': 'https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2517753454.jpg', 'title': '復仇者聯盟3:無限戰爭', 'score': '8.6'}
{'image': 'https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2517769368.jpg', 'title': '小公主艾薇拉與神祕王國', 'score': '0'}
...
{'image': 'https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2519994468.jpg', 'title': '後來的我們', 'score': '5.8'}

中間的部分輸出結果已省略,可以看到這樣就成功把電影資訊爬取下來了。
這時我們再看下文字檔案,結果如圖所示:20180512143407_result.png

以上~~你對爬蟲有進一步的瞭解了麼? 請繼續關注我的爬蟲系列~~~

相關推薦

python-入門第一爬蟲例子

前言: 此文為大家入門爬蟲來做一次簡單的例子,讓大家更直觀的來了解爬蟲。 本次我們利用 Requests 和正則表示式來抓取豆瓣電影的相關內容。 一、本次目標: 二、準備工作 確保已經正確安裝 Requests 庫,無論是 Windows、Linux 還是 Mac,都可以通過 Pip 這個包管理工具來安

孤荷淩寒自學python第七十二天開始寫Python第一爬蟲2

db2 它的 def 基礎上 開始 零基礎 精神 agent 收費 孤荷淩寒自學python第七十二天開始寫Python的第一個爬蟲2 (完整學習過程屏幕記錄視頻地址在文末) 今天在上一天的基礎上繼續完成對我的第一個代碼程序的書寫。 直接上代碼。詳細過程見文末屏

孤荷淩寒自學python第七十五天開始寫Python第一爬蟲5

爬蟲 社區 現在 清晰 學習之路 for -m Nid 語音 孤荷淩寒自學python第七十五天開始寫Python的第一個爬蟲5 (完整學習過程屏幕記錄視頻地址在文末) 今天在上一天的基礎上繼續完成對我的第一個代碼程序的書寫。 直接上代碼。詳細過程見文末屏幕錄像

孤荷淩寒自學python第八十天開始寫Python第一爬蟲10

方式 語言 tid 自己的 nts lse 鏈接 red 思路 孤荷淩寒自學python第八十天開始寫Python的第一個爬蟲10 (完整學習過程屏幕記錄視頻地址在文末) 原計劃今天應當可以解決讀取所有頁的目錄並轉而取出所有新聞的功能,不過由於學習時間不夠,只是進一

python第一爬蟲例子抓取數據到mysql,實測有數據

入mysql數據庫 nor gecko /usr png 支持 web local webkit python3.5 先安裝庫或者擴展 1 requests第三方擴展庫 pip3 install requests 2 pymysql pip3 install pym

Python爬蟲入門——2. 1 我的第一爬蟲程式

         第一個爬蟲程式就寫的簡單一點,我們用requests庫以及BeautifulSoup庫來完成我們的第一個程式(我們所用的python版本為  3.x)。我們爬取豆瓣圖書(https://book.douban.com/top250?start=25)Top1

python第一爬蟲腳本

python -c get makedirs www 腳本 data close htm import urllib.requestimport reimport os url = "http://www.budejie.com/" # 爬的地址 def get_page

第一爬蟲開始前決定你的Python版本,你要使用什麼寫爬蟲爬蟲認知篇(3)

       Python入門當然建議直接學Python3了,畢竟是趨勢。 而且Python3中對於字元編碼的改動會讓新手省掉很多很多很多關於字元編解碼問題的糾結。 另一方面看你專案大小吧。 如果自己寫程式碼,Python2和Python3沒啥區別。 但是

第002講:用Python設計第一遊戲|學習記錄(小甲魚零基礎入門學習Python

(標答出處: 魚C論壇) 《零基礎入門學習Python》 測試題: 什麼是BIF? BIF指的是bulit in function,指的是Python裡的內建函式。 用課堂上小甲魚教的方法數一數 Python3 提供了多少個 BIF? 輸入&g

python之Scrapy框架的第一爬蟲

執行: D:\pycodes\python123demo>scrapy crawl demo scrapy crawl demo 學習筆記: 程式碼: D:\pycodes>scrapy startproject python123demo Ne

python第一爬蟲程式

 轉載https://www.cnblogs.com/Axi8/p/5757270.html 把python2的部分改成python3了,爬取百度貼吧某帖子內的圖片。 #coding:utf-8 import urllib.request#python3 i

Python網路爬蟲學習筆記——第一爬蟲程式

執行環境 語言 Python3 第三方庫 pip install reqeusts pip install BeautifulSoup4 pip install jupyter 線上編輯器 安裝 jupyter 模組後,在cmd視窗中執行命令jupyte

小甲魚的《零基礎入門學習Python》[課後作業] 第002講:用Python設計第一遊戲 | 課後測試題及答案

0. 什麼是BIF?BIF 就是 Built-in Functions,內建函式。為了方便程式設計師快速編寫指令碼程式(指令碼就是要程式設計速度快快快!!!),Python 提供了非常豐富的內建函式,我們只需要直接呼叫即可,例如 print() 的功能是“列印到螢幕”,inp

爬蟲入門,從第一爬蟲建立起做蟲師的心,爬蟲簡單的入門庫fake_useragent,偽造隨機的請求頭,簡單用法-案例篇(4)

from urllib.request import Request,urlopen from fake_useragent import UserAgent url ='https://www.sxt

爬蟲入門,從第一爬蟲建立起做蟲師的心,爬蟲的編譯器的安裝,pycharm第三方庫的安裝和pip的安裝,爬蟲的認知篇(5)

          Python之所以強大並逐漸流行起來,一部分原因要歸功於Python強大的第三方庫。這樣使用者就不用瞭解底層的思想,用最少的程式碼寫出最多的功能。 在PyCharm中安裝

Python第一爬蟲程式(urllib.request)

這是博主第一個小爬蟲程式,紀念一下 2018/09/20 之前在ubuntu裡面已經實現,不過今天開始使用pycharm,折騰了一上午…終於打出來了。 話不多說… 目標:爬取博主一篇博文(Path of Python – 爬蟲)裡面的遊覽數。 import r

入門學習-Python-小甲魚學習資料-Day002-用Python設計第一遊戲

標題 用Python設計第一個遊戲 根據視訊自己練習 : 直接上原始碼了 print(’------------------我愛Python------------------’) tmp = input("test the input, you can input anythi

Python入門100例項(20)——物件的例子

從本例項學到什麼 結合例子闡述物件是什麼 物件的方法的例子 背景和例子 假設我們要開發學生成績管理系統。這個軟體具有以下功能: 1. 記錄每個學生的語文、數學和英語成績。 2. 求學生的總成績。 3. 求學生的三門課平均成績。 4. 統計學

零基礎入門學習Python(2)--用Python設計第一遊戲

前言 小甲魚的Python課程都是圍繞著一個個小遊戲,進行Python的講解,由易入難。 小遊戲流程圖 Created with Raphaël 2.1.2Startprint('------------------我愛魚C工作室-------------

Junit4入門第一例子

1.使用規則 * 1.測試方法上必須使用@Test進行修飾 * 2.測試方法必須使用public void 進行修飾,不能帶任何的引數* 3.新建一個原始碼目錄來存放我們的測試程式碼  * 4.測試類的包應該和被測試類保持一致 * 5.測試單元中的每個方法必須可以獨立測試,