1. 程式人生 > >Python網路爬蟲(四):selenium+chrome爬取美女圖片

Python網路爬蟲(四):selenium+chrome爬取美女圖片

說明:
Python版本:Python
IDE:PyCharm
chrome版本:我的版本63
chromedriver.exe:因為是模擬瀏覽器訪問,chrome需要再下載一個驅動,具體方式在我的上一篇部落格,內容很詳細。傳送門:Python網路爬蟲(三)chromedriver.exe與chrome版本對映及下載連結:

一、selenium

(1)selenium簡介:

為什麼用selenium?
前面我們學習瞭如何爬取一個靜態網頁,但是,面對有javascript渲染的頁面再用前面的方式就不能得心應手。
所以我們選擇selenium
什麼是selenium?
一句話,自動化測試工具。它支援各種瀏覽器,包括 Chrome,Safari,Firefox 等主流介面式瀏覽器,如果你在這些瀏覽器裡面安裝一個 Selenium 的外掛,那麼便可以方便地實現Web介面的測試。換句話說叫 Selenium 支援這些瀏覽器驅動。Selenium支援多種語言開發,比如 Java,C,Ruby等等,而對於Python,當然也是支援的!

(2)安裝selenium:

pip install selenium

二、小試牛刀:

這裡,我們以開啟百度頁面,並控制檯輸出百度頁面原始碼,為例。
程式碼:

from selenium import webdriver

if __name__ =='__main__':
    list_urls=[]
    url="http://www.baidu.com"

    options = webdriver.ChromeOptions()

    options.add_argument('user-agent="Mozilla/5.0 (Linux; Android 4.0.4; Galaxy Nexus Build/IMM76B) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.133 Mobile Safari/535.19",--headless'
) #options.add_argument('--headless') #options.add_argument('--disable-gpu') driver=webdriver.Chrome(chrome_options=options) driver.get(url) html = driver.page_source print(html)

如圖,chrome瀏覽器自動打開了百度頁面,控制檯輸出了頁面原始碼。
這裡寫圖片描述
注意:
(1)註釋的兩行為使用chrome的headless模式,即不用每次都開啟瀏覽器的視窗,否則,我們做爬蟲時,爬取每個網頁還跳出視窗,體驗太差。自從chrome瀏覽器提供了headless chrome,相比PhantomJS(更早的一個無頭瀏覽器),獲得的資料更優質。但速度可能慢些。
(2) driver.get 方法會開啟請求的URL,WebDriver 會等待頁面完全載入完成之後才會返回,即程式會等待頁面的所有內容載入完成,JS渲染完畢之後才繼續往下執行。

所以,我們可以得到JS渲染之後的頁面原始碼。

有了以上的基礎,結合BeautifulSoup,我們完全可以作出好玩的事情。

(三)動手實戰:爬取妹子圖片

1、說在前面:

'user-agent="Mozilla/5.0 (Linux; Android 4.0.4; Galaxy Nexus Build/IMM76B) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.133 Mobile Safari/535.19"

我們用到的代理是安卓,事實證明比較好用。但是和你用電腦開啟網頁,通過審查元素看到的程式碼是不一樣的,所以你分析網頁的時候,需要用前面的例子,換掉百度的網址,執行程式,分析頁面原始碼。

2、分析頁面:

2.1 我們開啟網頁發現,每個圖片分別放在了class屬性為libox的div標籤裡。
這裡寫圖片描述
所以,我們會先用BeautifulSoup獲取主頁面所有,class屬性libox的div標籤。再將每個標籤的href存入list。

 list_urls=[]
    url="http://www.5442.com/tag/rosi.html"

    options = webdriver.ChromeOptions()
    options.add_argument('user-agent="Mozilla/5.0 (Linux; Android 4.0.4; Galaxy Nexus Build/IMM76B) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.133 Mobile Safari/535.19"')
    options.add_argument('--headless')
    options.add_argument('--disable-gpu')
    driver=webdriver.Chrome(chrome_options=options)
    driver.get(url)
    html=driver.page_source
    driver.close()
   # print(html)
    bf=BeautifulSoup(html,'lxml')
    target_urls=bf.find_all(name="div",class_='libox')
    for each in target_urls:
        print(each.a.get('href'))
        list_urls.append(each.a.get('href'))

    print(len(list_urls))

2.2 選擇一張美女圖片,我們看到,每個頁面中有兩張,為了簡單起見,我們這裡就下載每個頁面的兩張圖片。
通過審查元素,我們可以看到,這兩張圖片放在了,align屬性為center的p標籤裡。所以我們將用BeautifulSoup獲得p標籤中所有的src。之後,下載儲存圖片。
這裡寫圖片描述
程式碼:

    for each_img in list_urls:

        target_url =each_img
        options = webdriver.ChromeOptions()
        options.add_argument(
            'user-agent="Mozilla/5.0 (Linux; Android 4.0.4; Galaxy Nexus Build/IMM76B) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.133 Mobile Safari/535.19",')
        options.add_argument('--headless')
        options.add_argument('--disable-gpu')
        pdriver = webdriver.Chrome(chrome_options=options)
        pdriver.get(target_url)
        img_html = pdriver.page_source
        pdriver.close()
        pbf=BeautifulSoup(img_html,'lxml')
        piurls=pbf.find_all(name='p',align='center')
        ppbf=BeautifulSoup(str(piurls),'lxml')
        purls=ppbf.find_all(name='img')
        if 'images' not in os.listdir():
            os.makedirs('images')
        for each in purls:
            img_url=each.get('src')
            img_filename='images/'+each.get('alt')+'.jpg'
            print("正在下載",img_url)
            urlretrieve(url=img_url,filename=img_filename)

urlretrieve()函式:
urllib 模組提供的 urlretrieve() 函式。urlretrieve() 方法直接將遠端資料下載到本地。

urlretrieve(url, filename=None, reporthook=None, data=None)

· 引數 finename 指定了儲存本地路徑(如果引數未指定,urllib會生成一個臨時檔案儲存資料。)
· 引數 reporthook 是一個回撥函式,當連線上伺服器、以及相應的資料塊傳輸完畢時會觸發該回調,我們可以利用這個回撥函式來顯示當前的下載進度。
· 引數 data 指 post 到伺服器的資料,該方法返回一個包含兩個元素的(filename, headers)元組,filename 表示儲存到本地的路徑,header 表示伺服器的響應頭。

3、執行程式:

程式碼我們已經寫完了,執行一下,我們檢視結果:
想了想,還是處理一下,別被和諧了。
這裡寫圖片描述

(四)完整程式碼:

# -*- coding:UTF-8 -*-
'''
單程序
下載妹子圖片
'''
from bs4 import BeautifulSoup
from urllib.request import urlretrieve
import os
from selenium import webdriver

if __name__ =='__main__':
    list_urls=[]
    url="http://www.5442.com/tag/rosi.html"

    options = webdriver.ChromeOptions()
    options.add_argument('user-agent="Mozilla/5.0 (Linux; Android 4.0.4; Galaxy Nexus Build/IMM76B) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.133 Mobile Safari/535.19"')
    options.add_argument('--headless')
    options.add_argument('--disable-gpu')
    driver=webdriver.Chrome(chrome_options=options)
    driver.get(url)
    html=driver.page_source
    driver.close()
   # print(html)
    bf=BeautifulSoup(html,'lxml')
    target_urls=bf.find_all(name="div",class_='libox')
    for each in target_urls:
        print(each.a.get('href'))
        list_urls.append(each.a.get('href'))

    print(len(list_urls))

    for each_img in list_urls:

        target_url =each_img
        options = webdriver.ChromeOptions()
        options.add_argument(
            'user-agent="Mozilla/5.0 (Linux; Android 4.0.4; Galaxy Nexus Build/IMM76B) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.133 Mobile Safari/535.19",')
        options.add_argument('--headless')
        options.add_argument('--disable-gpu')
        pdriver = webdriver.Chrome(chrome_options=options)
        pdriver.get(target_url)
        img_html = pdriver.page_source
        pdriver.close()
        pbf=BeautifulSoup(img_html,'lxml')
        piurls=pbf.find_all(name='p',align='center')
        ppbf=BeautifulSoup(str(piurls),'lxml')
        purls=ppbf.find_all(name='img')
        if 'images' not in os.listdir():
            os.makedirs('images')
        for each in purls:
            img_url=each.get('src')
            img_filename='images/'+each.get('alt')+'.jpg'
            print("正在下載",img_url)
            urlretrieve(url=img_url,filename=img_filename)

Python處理javascript頁面也有別的方法,但模擬瀏覽器訪問更簡單,更友好。這個方案最自然,雖然有人一直在批評這種方法速度比較慢,但在實際執行環境中,大部分情況下你會擔心執行的太快了,集中且持續的從同一個網站抓取資料,會給網站造成很大的壓力,從而會被封鎖或者遇到驗證碼,所以速度並不是關鍵問題。

相關推薦

Python網路爬蟲selenium+chrome美女圖片

說明: Python版本:Python IDE:PyCharm chrome版本:我的版本63 chromedriver.exe:因為是模擬瀏覽器訪問,chrome需要再下載一個驅動,具體方式在我的上一篇部落格,內容很詳細。傳送門:Python網路爬蟲(

Python網路爬蟲視訊下載器

這一節實現一個下載 iqiyi VIP視訊的爬蟲。 需要的準備:旋風視訊VIP解析網站或其他解析網站 原理理解: 在視訊解析網站獲取視訊的過程中,首先會向視訊伺服器傳送GET請求,獲得伺服器發來的資訊;接到資訊後,再向伺服器POST資料,即將類似於密碼

[Python]網路爬蟲Opener與Handler

在開始後面的內容之前,先來解釋一下urllib2中的兩個個方法:info and geturl  urlopen返回的應答物件response(或者HTTPError例項)有兩個很有用的方法info()和geturl() 1.geturl(): geturl()返回獲

[Python]網路爬蟲網頁的含義和URL基本構成

一、網路爬蟲的定義 網路爬蟲,即Web Spider,是一個很形象的名字。 把網際網路比喻成一個蜘蛛網,那麼Spider就是在網上爬來爬去的蜘蛛。 網路蜘蛛是通過網頁的連結地址來尋找網頁的。 從網站某一個頁面(通常是首頁)開始,讀取網頁的內容,找到在網頁中的其它連結地址

[Python]網路爬蟲利用urllib2通過指定的URL抓網頁內容

版本號:Python2.7.5,Python3改動較大,各位另尋教程。 所謂網頁抓取,就是把URL地址中指定的網路資源從網路流中讀取出來,儲存到本地。  類似於使用程式模擬IE瀏覽器的功能,把URL作為HTTP請求的內容傳送到伺服器端, 然後讀取伺服器端的響應資源。 在

[Python]網路爬蟲urllib2的使用細節與抓站技巧

前面說到了urllib2的簡單入門,下面整理了一部分urllib2的使用細節。 1.Proxy 的設定 urllib2 預設會使用環境變數 http_proxy 來設定 HTTP Proxy。 如果想在程式中明確控制 Proxy 而不受環境變數的影響,可以使用代理。

Python網路爬蟲chromdriver.exe與chrome版本對映及下載連結

前言:最近正在學習Python網路爬蟲,學到selenium,需要用到chrome瀏覽器的驅動,但是網上的很多地址都被牆了,而且沒有準確的驅動和chrome版本的對映,很麻煩。現在我已經解決了這些問題,現在把對映和下載連結分享出來。 (一)檢視chrome

Python網路爬蟲頂點小說網站全部小說,並存入MongoDB

前言:本篇部落格將爬取頂點小說網站全部小說、涉及到的問題有:Scrapy架構、斷點續傳問題、Mongodb資料庫相關操作。 背景: Python版本:Anaconda3 執行平臺:Windows IDE:PyCharm 資料庫:MongoDB 瀏

[Python]網路爬蟲利用urllib通過指定的URL抓網頁內容

1.基本方法 urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=F

Python網路爬蟲解決ImportError:DLL load failed作業系統無法執行問題

背景: Python版本:Anaconda3 問題描述: 最近在執行scrapy專案時,本來安裝好好的scrapy框架突然報錯,猝不及防, ImportError:DLL load failed:作業系統無法執行%1 如圖: 自己也是百思

[Python]網路爬蟲使用cookiejar管理cookie 以及 模擬登入知乎

大家好哈,上一節我們研究了一下爬蟲的異常處理問題,那麼接下來我們一起來看一下Cookie的使用。 為什麼要使用Cookie呢? Cookie,指某些網站為了辨別使用者身份、進行session跟蹤而儲存在使用者本地終端上的資料(通常經過加密) 比如說有些網站需要登入後才

Python高階爬蟲動態載入頁面的解決方案與爬蟲代理

*原創作者:VillanCh 0×00 前言 0×01 動態頁面解決方案Selenium+PhantomJS 0×02 原理回顧對比 0×03 Quick Start 0×04 webdriver API 0×05 匿名爬蟲 0×06 匿名爬蟲解決方案 0×07 完結總結

資料採集用XPath鏈家網房價資料

準備工作 編寫爬蟲前的準備工作,我們需要匯入用到的庫,這裡主要使用的是requests和lxml兩個。還有一個Time庫,負責設定每次抓取的休息時間。 import requests import requests import time from lxml

python爬蟲實戰selenium爬蟲阿里巴巴採購批發商品

一、前言 二、學習資料(感謝分享) 三、開始爬取 1、先分析目標網址,為什麼選擇selenium 在搜尋中輸入女裝,用F12檢視原始碼,看看網頁顯示的內容是不是Ajax。點選Network,選擇下面的XHR,按F5重新整理頁面,下

python爬蟲scrapy 【1. 快速上手】

中文文件:http://www.scrapyd.cn/doc/   Scrapy是採用Python開發的一個快速、高層次的螢幕抓取和web抓取框架。 什麼是爬蟲框架? 爬蟲框架是實現爬蟲功能的一個軟體結構和功能元件集合。 爬蟲框架是一個半成品,能夠幫助使用者實現專業網路

python爬蟲scrapy 【2. 其他重要部分】

中文文件:http://www.scrapyd.cn/doc/   本節包括: 1. resquest 和 response 的屬性方法 2. scrapy提取資訊的強大方法     request 和 response request:

網路爬蟲】【java】微博爬蟲資料處理——jsoup工具解析html、dom4j讀寫xml

        之前提到過,對於簡單的網頁結構解析,可以直接通過觀察法、手工寫正則解析,可以做出來,比如網易微博。但是對於結構稍微複雜點的,比如新浪微博,如果還用正則,用眼睛一個個去找,未免太麻煩了。         本文介紹兩個工具包:解析html, xml的jsoup,

網路爬蟲Python中的正則表示式教程

接下來準備用糗百做一個爬蟲的小例子。 但是在這之前,先詳細的整理一下Python中的正則表示式的相關內容。 正則表示式在Python爬蟲中的作用就像是老師點名時用的花名冊一樣,是必不可少的神兵利器。 整理時沒有注意,實在抱歉。 一、 正則表示式基礎 1.1.概

小白學 Python 爬蟲29Selenium 獲取某大型電商網站商品資訊

人生苦短,我用 Python 前文傳送門: 小白學 Python 爬蟲(1):開篇 小白學 Python 爬蟲(2):前置準備(一)基本類庫的安裝 小白學 Python 爬蟲(3):前置準備(二)Linux基礎入門 小白學 Python 爬蟲(4):前置準備(三)Docker基礎入門 小白學 Pyth

Python學習之路 爬蟲正則表示式去名言網

auth Python標準庫 我們 color 匯總 eight code 比較 school 爬蟲的四個主要步驟 明確目標 (要知道你準備在哪個範圍或者網站去搜索) 爬 (將所有的網站的內容全部爬下來) 取 (去掉對我們沒用處的數據) 處理數據(按照我們想要的