python3學習筆記之九——爬取煎蛋上的妹子圖

看到csdn公衆號上推送的一篇利用selenium+PhantomJs爬取煎蛋妹子圖的文章,對於初學爬蟲的我躍躍欲試。

selenium是自動化測試的工作,Phantomjs相當於無界面的瀏覽器,用的內核是webkit,很遺憾的是當我配置完環境之後,調試時,蹦出來一個警告,大致意思selenium不支持Phantomjs,請使用headless的chrome和firefox。後來又查了下,說是selenium3.4版本以後不支持Phantomjs.而我的selenium版本是3.11。

既然提示使用headless的chrome和firefox,我就又去搜索了一下,下載了chromedriver。headless模式就是加一個參數

option = webdriver.ChromeOptions()
option.add_argument('headless')

結果呢,一直提示gpu的問題,通過搜索大佬的文章,得知option必須增加一個參數:

options.add_argument("--disable-gpu")

添加參數之後,倒是可以運行,但是速度奇慢無比,而且遇到稍微複雜的網站,一直會出現超時,根本無法獲取頁面源文件。

不知道是不是chrome瀏覽器版本與驅動版本,又或者是和selenium版本的兼容性差?

我果斷嘗試了firefox的headless模式,結果發現相當好用。

---------------這裏是爬取妹子圖的分割線----------------

環境如下:

python3.6

selenium3.11

firefox 59.0.2

下載妹子圖,首先要分析妹子圖的下載鏈接,打開http://jandan.net/ooxx 煎蛋妹子圖首頁,在圖片上右鍵查看元素

圖片定位到<img src>這行,沒錯這是圖片的地址,但仔細看看會發現每張圖片的左上角會有一個‘查看原圖’的灰色字體,點開來是高清原圖,再看<img src>的上面一行也有一個鏈接,在href裏面,後面的text正是查看原圖,複製到瀏覽器中正是原圖的鏈接。

想要爬取圖片,只要先獲取這些圖片的地址,然後下載下來就可以了,首先獲取頁面源碼。

from bs4 import BeautifulSoup
from selenium import webdriver
from lxml import etree

option = webdriver.FirefoxOptions()
option.set_headless()
driver = webdriver.Firefox(firefox_options=option)
driver.get('http://jandan.net/ooxx')
source = driver.page_source

獲取到頁面源碼之後,將源碼進行解析。之前我一直用BeautifulSoup來提取數據

btu = BeautifulSoup(source,'html.parser')
imglist = btu.find_all(class_='view_img_link')
for img in imglist:
print(img.get('href'))

後來發現利用lxml的etree速度更快,提取結果是一致的

content = etree.HTML(source)
imglist = content.xpath('//div[@class="text"]/p/a/@href')

唯一不一樣的是用xpath直接提取href的鏈接,不用再像BeautifulSoup中先定位到class,再get(‘href’)

執行結果:


完整代碼如下:

from selenium import webdriver
from lxml import etree
import requests
import time
import random

class download_img(object):
def __init__(self):
self.url = 'http://jandan.net/ooxx'
option = webdriver.FirefoxOptions()
option.set_headless()
self.driver = webdriver.Firefox(firefox_options=option)
def pageurl(self):
page_url = []
for i in range(10,12):
url = 'http://jandan.net/ooxx/page-%d#comments' % i
page_url.append(url)
print (url)
return page_url
def imgurl(self,url):
self.driver.get(url)
time.sleep(5)
source = self.driver.page_source
self.driver.quit()
content = etree.HTML(source)
imglist = content.xpath('//div[@class="text"]/p/a[@class="view_img_link"]/@href')
for i in range(len(imglist)):
imglist[i] = 'http:' + imglist[i]
return imglist
def downloder(self,url):
i = 1
for each in url:
time.sleep(random.randint(1,10))
name = each.split('/')[-1]
content = requests.get(each).content
with open('C:\\Users\\CryptFiend\\Downloads\\python\\pic\\%s' % name,'wb+') as f:
f.write(content)
print ('下載第%s張圖片' % i)
i += 1

if __name__ == '__main__':
img = download_img()
pageurl = img.pageurl()
for each in pageurl:
imglist = img.imgurl(each)
img.downloder(imglist)


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章