1. 程式人生 > >分享一個零基礎快速爬取資料的工具

分享一個零基礎快速爬取資料的工具

今天介紹下如何使用pyppeteer抓取網頁的資料。pyppeteer是web應用自動化測試的具,可以直接執行在瀏覽器中,通過程式碼控制與頁面上元素進行互動,並獲取對應的資訊。

以前我們我們爬取資料都是通過寫程式碼爬取,當待爬取的網站需要登入時,我們需要在程式碼中模擬登入;當爬取過快需要驗證時,我們需要在程式碼中實現驗證邏輯;當ip被封時,還需要有自己的動態ip庫。待爬網站的反爬策略越多,我們爬取的成本就越大。總之,用寫程式碼的方式爬取資料需要構造比較複雜的請求,想盡一切辦法將爬蟲偽裝成真實的使用者。

使用pyppeteer這樣的工具,就可以在很大程度上解決上面的問題。同時,還有一個優點是所見即所得,不需要再去研究網頁複雜的請求結構。當然這類工具也是優缺點的,它增加了你去理解網頁上各種元素以及互動的成本。所以我覺得這類工具最適合在短平快的爬蟲場景中使用。比如我在最近的工作中就遇到兩次這樣的情況,想爬一些特別簡單的資料來提升工作效率,但又不想研究網頁是如何構造請求的,用這種所見即所得的工具就可以快速抓取想要的資料。

下面我們以“抓取百度搜索資料”例子我介紹一下pyppeteer的使用。正式介紹前我們先來看下爬取效果:

![](https://user-gold-cdn.xitu.io/2020/5/17/172231de51653d7f?w=1316&h=1026&f=gif&s=2526423)

安裝pyppeteer

python3 -m pip install pyppeteer

安裝完成後,執行pyppeteer-install命令安裝最新版本的 Chromium 瀏覽器。根據官方文件的說明,安裝pyppeteer需要Python3.6以上的版本。

由於pyppeteer是基於asyncio實現的,所以我們的程式碼中也會用async/await來寫程式碼,之前沒寫過的朋友也不用擔心,基本不影響對pyppeteer

的使用,有必要的話以後再單獨寫篇文章介紹。

首先,用pyppeteer啟動 chrome 程序

from pyppeteer import launch
# headless 顯示瀏覽器
# --window-size 設定窗體大小
browser = await launch({'headless': False,
                        'args': ['--window-size=%d,%d' % (width, height)]
                        })

然後,開啟一個新的標籤,並訪問百度

# 開啟新頁面
page = await browser.newPage()  
# 設定內容顯示大小
await page.setViewport({"width": width, "height": height})  
# 訪問百度
await page.goto('https://www.baidu.com')  

開啟百度網站後,下一步就要向搜尋輸入框輸入內容,首先要找到輸入框的html標籤 從上圖可以看到,<input id="kw" name="wd" class="s_ipt" value="" maxlength="255" autocomplete="off">程式碼代表搜尋輸入框,該標籤的 class 是s_ipt,那下面我們就通過type函式找到該標籤,並鍵入需要搜尋的內容

# 將對應的 selector 填入 python,通過.s_ipt找到輸入框html標籤
await page.type('.s_ipt', 'python')

這裡我們搜的是python,有了輸入後就可以點選“百度一下”按鈕來發起搜尋。找按鈕的方式與上面一樣 可以看到<input type="submit" id="su" value="百度一下" class="bg s_btn">程式碼代表“百度一下”的按鈕,該標籤的 id 是su,下面就呼叫click函式找到該標籤,並點選

# 通過#su找到“百度一下”按鈕html標籤
await page.click('#su')

這裡需要注意su前面是#而不是.,因為在html標籤中它用id表示而不是class,這裡涉及html selector的內容,不清楚的朋友可以簡單補一下。

執行完上面的程式碼,我們可以看到搜尋結果了,呼叫screenshot方法將當前頁面儲存

await page.screenshot({'path': 'example.png'})

效果如下: 接下來我們就獲取網頁內容,並解析每條結果

# 獲取網頁內容
content = await page.content()
# 解析
output_search_result(content)

通過BeatifulSoup解析每條結果的標題與連結

def output_search_result(html):
    search_bs = BeautifulSoup(html, 'lxml')

    all_result = search_bs.find_all("div", {'class': "result c-container"})
    for single_res in all_result:
        title_bs = single_res.find("a")
        title_url = title_bs.get('href')
        title_txt = title_bs.get_text()

        print(title_txt, title_url)

輸出的內容如下

python官方網站 - Welcome to Python.org http://www.baidu.com/link?url=OqtoElo8HW1GdOgAlqdCTz2lpewFLf0HlbnGdyAKD06BfPbw0fsJ_N5fclxx-q1D
Python 基礎教程 | 菜鳥教程 http://www.baidu.com/link?url=IooFgJjdec1qPXhGhF7tur-z2Qt_43RkK3L-9cp8oB-0i2w7unKzLayLjg3zSQeKQieA49JFejMjqTM-TSY3V_
Python3 * 和 ** 運算子_python_極客點兒-CSDN部落格 http://www.baidu.com/link?url=H3VdAQRAbTkN9jGJGkvhIFTdg48O-b5yib7vCquWyg1-6FZwBVHnJ5iiUYQkjbf-8IuLfOwDXoUMDOdMvXNHkzejts4uRHrczgQqekgQuFy
Python教程 - 廖雪峰的官方網站 http://www.baidu.com/link?url=piu0nEfXNvkLhWchcdX2EjJvIkQ5beq2_uYH_B7u2vjYO82BZwr8SXgDxnVLZYgGL8xuR_ovjg2cAYfPS9AmLtqUQP-TrWuJWHNqYbxdQnUPTy_VPp8sSBdCaYBl9YDX
Python3 教程 | 菜鳥教程 http://www.baidu.com/link?url=bx1rMrzxC69Sp0zY08-VhFs40QQ8UFxZdvmZVFcKYkCG2mdojhAMjk5ulKBKwQm77x8vMyOeowW_bNtoP35m3q
你都用 Python 來做什麼? - 知乎 http://www.baidu.com/link?url=YTMr1ycFjtkWx8lgJ_PT3-kF50vYI6Yibh4o69WL_afBSOkkZmGxexxIKXY3fGAX8X2-AaFbI4jL1vJbKMJrsK
Python基礎教程,Python入門教程(非常詳細) http://www.baidu.com/link?url=elAepKY7rhULzTPuwKvk8Cxx21K5D0Ey7-Wj9TZgN49MyasPOXtLYfWbp46QZQie

這樣,我們的抓取資料的目的已經達到了,當然我們還可以繼續拓展下,多用用pyppeteer,比如:我們可以點選下一頁,抓取下一頁的內容

# next page
# 為了點選“下一頁”,需要將當前頁面滑到底部
dimensions = await page.evaluate('window.scrollTo(0, window.innerHeight)')
# 點選“下一頁”按鈕
await page.click('.n')
# 獲取第二頁的內容
content = await page.content()
# 解析
output_search_result(content)

操作與之前類似,註釋寫的也比較清楚,我就不再贅述了。最後可以呼叫await browser.close()程式碼關閉瀏覽器。上述程式碼可以定義需要定義在一個async函式中,如:

async def main():
  # ... 抓取程式碼

然後通過下面程式碼

asyncio.get_event_loop().run_until_complete(main())

呼叫main函式。

pyppeteer的用法就介紹到這裡了,類似的工具還有很多,比如:Selenium,我也試了下,確實如網上所說配置上面需要花些功夫,有興趣的朋友可以自行嘗試。希望今天的內容對你有用。關注公眾號回覆關鍵字 爬蟲 獲取完整原始碼

歡迎公眾號「**渡碼**」,輸出別地兒看不到的乾貨。

相關推薦

分享一個基礎快速資料工具

今天介紹下如何使用pyppeteer抓取網頁的資料。pyppeteer是web應用自動化測試的具,可以直接執行在瀏覽器中,通過程式碼控制與頁面上元素進行互動,並獲取對應的資訊。 以前我們我們爬取資料都是通過寫程式碼爬取,當待爬取的網站需要登入時,我們需要在程式碼中模擬登入;當爬取過快需要驗證時,我們需要在程式

python爬蟲實踐——基礎快速入門(二)豆瓣電影

爬蟲又稱為網頁蜘蛛,是一種程式或指令碼。 但重點在於,它能夠按照一定的規則,自動獲取網頁資訊。 爬蟲的基本原理——通用框架 1.挑選種子URL; 2.講這些URL放入帶抓取的URL列隊; 3.取出帶抓取的URL,下載並存儲進已下載網頁庫中。此外,講這些URL放入帶抓取UR

python爬蟲實踐——基礎快速入門(四)小豬租房資訊

接下來我們爬取小豬短租租房資訊。進入主頁後選擇深圳地區的位置。地址如下: http://sz.xiaozhu.com/ 一,標題爬取 按照慣例,我們先複製標題的xpath資訊,多複製幾個進行對比: //*[@id="page_list"]/ul/li[1]/

基礎如何學習大資料?入門級學習方法分享

如何學習大資料,零基礎如何學習大資料?相信下面我們講到的入門級學習方法,能夠讓你快速入門。 大資料行業目前炒的很是火爆,但是大資料的發展依然並不是很成熟,尤其是對於一些小白。瞭解系統的學習大資料的方法將更有利於自己更加快速有效的去學習大資料。分享一下零基礎如何學習大資料。 第一、對於初學者尤

基礎,CCNA自學資料

零基礎 ccna 自學資料 視頻 題庫最新CCNA VIP視頻教程 鏈接: http://pan.baidu.com/s/1eRVw514 密碼: z9unCCNA題庫V3.0(2017月4月) 鏈接: http://pan.baidu.com/s/1boWOCdL 密碼: j4nwCCNA實驗 鏈接: ht

Python 基礎 快速入門 趣味教程 (咪博士 海龜繪圖 turtle) 2. 變量

b- 剛才 math .com war 單位 中學 技術分享 sublime 大家在中學就已經學過變量的概念了。例如:我們令 x = 100,則可以推出 x*2 = 200 試試下面這段 Python 代碼 1 import turtle 2 3 turtle.sha

1、HTML+DIV+CSS基礎快速入門到制作企業站視頻課程_2 html列表的用法

pre inf java src TP 入門到 超文本 技術分享 分享 0.無序列表 1.有序列表 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <m

1、HTML+DIV+CSS基礎快速入門到制作企業站視頻課程_12 css邊框

技術分享 blue color 入門到 div 視頻 ted col ID 復合寫法: border: 2px solid red; 分開寫法: border-color: red; border-bottom-color: blue; border-bo

1、HTML+DIV+CSS基礎快速入門到制作企業站視頻課程_20 css樣式作業

order 技術分享 enter -a bsp 樣式 over model ctype 1、HTML+DIV+CSS零基礎快速入門到制作企業站視頻課程_20 css樣式作業 1 <!DOCTYPE html> 2 <html lan

基礎快速入門SpringBoot2.0 (一)

acc href 項目文件 apache tro maven打包 相關 utf tps 零基礎快速入門SpringBoot2.0 (一) 一、SpringBoot2.x依賴環境和版本新特性說明 簡介:講解新版本依賴環境和springboot2新特性概述

基礎快速入門SpringBoot2.0 教程(二)

新版本 exec list string classes 控制器 project mat 生命 一、SpringBoot2.x使用Dev-tool熱部署簡介:介紹什麽是熱部署,使用springboot結合dev-tool工具,快速加載啟動應用 官方地址:https://do

基礎快速入門SpringBoot2.0教程 (四)

trace ssh ket files frame ali serialize fis 系統服務 一、JMS介紹和使用場景及基礎編程模型簡介:講解什麽是小寫隊列,JMS的基礎知識和使用場景 1、什麽是JMS: Java消息服務(Java Message Service),J

我的第一個python爬蟲:豆瓣top250前100部電影

爬取豆瓣top250前100部電影   1 # -*-coding=UTF-8 -*- 2 3 import requests 4 from bs4 import BeautifulSoup 5 6 headers = {'User-Agent':'Moz

將豆瓣排名前250資料通過sqlite3存入資料庫

#爬取豆瓣top250電影,並儲存到資料庫 import requests from bs4 import BeautifulSoup import sqlite3 def get_html(web_url): user_agent = 'Mozilla/5.0 (Linux; Andro

python爬蟲-基礎入門-整個網站《1》

python爬蟲-基礎入門-爬取整個網站《1》 描述:   使用環境:python2.7.15 ,開發工具:pycharm,現爬取一個網站頁面(http://www.baidu.com)所有資料。 python程式碼如下: 1 # -*- coding: utf-8 -*- 2 3 i

python爬蟲-基礎入門-整個網站《2》

python爬蟲-基礎入門-爬取整個網站《2》 描述:   開場白已在《python爬蟲-基礎入門-爬取整個網站《1》》中描述過了,這裡不在描述,只附上 python3 的程式碼。   python3 指令碼程式碼: 1 #-*- coding: utf-8 -

python爬蟲-基礎入門-整個網站《3》

python爬蟲-基礎入門-爬取整個網站《3》 描述:   前兩章粗略的講述了python2、python3爬取整個網站,這章節簡單的記錄一下python2、python3的區別   python2.x 使用類庫:   >> urllib 庫   >> urlli

如何利用Python快速B站全站視訊資訊

B 站我想大家都熟悉吧,其實 B 站的爬蟲網上一搜一大堆。不過 紙上得來終覺淺,絕知此事要躬行,我碼故我在。最終爬取到資料總量為 760萬 條。 準備工作 首先開啟 B 站,隨便在首頁找一個視訊點選進去。常規操作,開啟開發者工具。這次是目標是通過爬取 B 站提供的 api 來獲取視訊資

R中使用rvest資料小試

總結R中使用 xpath 和 css selectors 獲取標籤內容(xpath功能強大,而CSS選擇器通常語法比較簡潔,執行速度更快些) 例:抓取下面標籤的內容: <h3 class="lister index unbold text"><span>小明他很忙</

selenium+python資料跳轉網頁

專案要做一個四個層級欄的資料抓取,而且點選查詢後資料會在新跳出的網頁。 原始碼如下 註釋解釋 from selenium import webdriver import selenium #from time import sleep as sp url='http://202.127.42.15