這篇文章干嘛的?
本屌在上網時偶然看到一個圖片網站,網站的尺度是這樣的:
里面的美女露骨而不露點,簡直是宅男福利。一時興起,決定將網站上的圖片down下來研究研究。正好最近在研究python,所以決定用這個抓取圖片存到本地,將圖片url存到 mongodb以防止以后用。
源碼項目github地址 : https://github.com/panacena/mmPictures/
爬蟲初識
網絡爬蟲(又被稱為網頁蜘蛛,網絡機器人,在FOAF社區中間,更經常的稱為網頁追逐者),是一種按照一定的規則,自動的抓取萬維網信息的程序或者腳本。
要學習Python爬蟲,我們要學習的共有以下幾點:
- Python基礎知識
- Python中urllib和urllib2庫的用法
- Python正則表達式
- Python爬蟲框架Scrapy
- Python爬蟲更高級的功能
當然,我們今天暫時不需要使用框架進行爬取,只用urllib2等庫進行操作。其它的一些關于爬蟲的一些基本信息,可以在這位大神的博客中學習到。學習爬蟲點我。
開始爬取
確定URL開始抓取
-
我們以 http://www.zngirls.com/rank/sum/ 為起始頁面進行爬取,打開網頁后右鍵查看源代碼。
打開這個url后,如圖1。我們需要關心的是紅色鏈接的內容。
圖1 -
這個如何查找呢?如果你用的是360瀏覽器,在MM圖片那右擊,選擇“審查元素”。之后就可以查看到點擊MM頭像后跳轉的url地址和MM頭像的url地址 。圖2:
圖2
3 . 現在還是沒有看到寫真的圖片,我們點擊MM的頭像,進入到了下圖的頁面 http://www.zngirls.com/girl/21751/ 可以看到如圖3這個頁面也沒有寫真的具體圖片,只是寫真的封面集合。不急,我們繼續點擊封面。
4 . 點擊封面后,http://www.zngirls.com/g/19671/1.html 進入的頁面就可以看到寫真的具體圖片了。這時我們就可以爬取圖片地址了。當然,這個也是分頁的,所以也需要獲取一共多少頁以及每一頁的url。
開始碼代碼吧
從上面的步驟我們整理一下思路,大概分為以下三部:
- 第一步 從 http://www.zngirls.com/rank/sum/ 開始抓取MM點擊頭像的鏈接(注意是分頁的)
- 第二部 從 http://www.zngirls.com/girl/21751/ 抓取每一個寫真集合的鏈接(注意是分頁的)
- 第三部 從 http://www.zngirls.com/g/19671/1.html 在寫真圖片的具體頁面抓取圖片(注意是分頁的)
1. 從起始頁面 http://www.zngirls.com/rank/sum/ 開始首選先獲取分頁的頁數以及每一頁的url,方便下一步獲取點擊MM獲取專輯url地址。接著解析每一頁的html,獲取每一頁中點擊MM頭像后跳轉的專輯集合頁面。
"""
從起始頁面 http://www.zngirls.com/rank/sum/ 開始獲取排名的頁數和每一頁的url
"""
def mmRankSum():
req = urllib2.Request("http://www.zngirls.com/rank/sum/", headers=header)
html = urllib2.urlopen(req)
htmldata = html.read()
htmlpath = etree.HTML(htmldata)
#首先獲取頁碼數,然后用循環的方式挨個解析每一個頁面
pages = htmlpath.xpath('//div[@class="pagesYY"]/div/a/@href')
for i in range( len(pages) -2 ):
pagesitem="http://www.zngirls.com/rank/sum/"+ pages[i]
mmRankitem(pagesitem)
"""
參數 url : 分頁中每一頁的具體url地址
通過穿過來的參數,使用 lxml和xpath 解析 html,獲取每一個MM寫真專輯頁面的url
"""
def mmRankitem(url):
req = urllib2.Request(url, headers=header)
html = urllib2.urlopen(req)
htmldata = html.read()
htmlpath = etree.HTML(htmldata)
pages = htmlpath.xpath('//div[@class="rankli_imgdiv"]/a/@href')
for i in range(len(pages)):
print "http://www.zngirls.com/" + pages[i]+"album/"
getAlbums("http://www.zngirls.com/" + pages[i]+"/album/")
2. 從mmRankitem方法中獲取到的url中解析每一個MM寫真專輯圖片的具體地址,也就是寫真圖片列表的頁面。
"""
參數 albumsurl: 每一個MM專輯的頁面地址
通過穿過來的參數,獲取每一個MM寫真專輯圖片集合的地址
"""
def getAlbums(girlUrl):
req = urllib2.Request(girlUrl, headers=header)
html = urllib2.urlopen(req)
htmldata = html.read()
htmlpath = etree.HTML(htmldata)
pages = htmlpath.xpath('//div[@class="igalleryli_div"]/a/@href')
for i in range(len(pages)):
print "http://www.zngirls.com/" + pages[i]
3. 從每一頁中獲取圖片的url,已經每一張圖片的名稱,方便下一步進行下載。
"""
參數 url : 每一個MM寫真專輯圖片集合的地址
通過穿過來的參數,首先先獲取圖片集合的頁數,然后每一頁解析寫真圖片的真實地址
"""
def getPagePicturess(albumsurl):
req = urllib2.Request(albumsurl, headers=header)
html = urllib2.urlopen(req)
htmldata = html.read()
htmlpath = etree.HTML(htmldata)
pages = htmlpath.xpath('//div[@id="pages"]/a/@href')
for i in range(len(pages)-2):
savePictures("http://www.zngirls.com" + pages[i])
"""
參數 url : 每一個MM寫真專輯圖片集合的地址(進過分頁檢測)
通過穿過來的參數,直接解析頁面,獲取寫真圖片的地址,然后下載保存到本地。
"""
def savePictures(itemPagesurl):
header = {
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36"
, "Connection": "keep-alive"
, "Referer": "image / webp, image / *, * / *;q = 0.8"
,"Accept":"image/webp,image/*,*/*;q=0.8"
}
req = urllib2.Request(itemPagesurl, headers=header)
html = urllib2.urlopen(req)
htmldata = html.read()
htmlpath = etree.HTML(htmldata)
print itemPagesurl
pages = htmlpath.xpath('//div[@class="gallery_wrapper"]/ul/img/@src')
for i in range(len(pages) ):
print pages[i]
pciturelist.append(pages[i])
4 .獲取每張圖片的url,可每張照片的名稱,然后下載到本地。
"""
參數 url : 每一個MM寫真專輯圖片集合的地址(進過分頁檢測)
通過穿過來的參數,直接解析頁面,獲取寫真圖片的地址,然后下載保存到本地。
"""
def savePictures(itemPagesurl):
header = {
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36"
, "Connection": "keep-alive"
, "Referer": "image / webp, image / *, * / *;q = 0.8"
,"Accept":"image/webp,image/*,*/*;q=0.8"
}
req = urllib2.Request(itemPagesurl, headers=header)
html = urllib2.urlopen(req)
htmldata = html.read()
htmlpath = etree.HTML(htmldata)
print itemPagesurl
pages = htmlpath.xpath('//div[@class="gallery_wrapper"]/ul/img/@src')
names = htmlpath.xpath('//div[@class="gallery_wrapper"]/ul/img/@alt')
for i in range(len(pages) ):
print pages[i]
pciturelist.append(pages[i])
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36"
, "Connection": "keep-alive"
, "Referer": pages[i]
}
req = urllib2.Request(pages[i], headers=headers)
urlhtml = urllib2.urlopen(req)
respHtml = urlhtml.read()
binfile = open('%s.jpg' % ( names[i] ) , "wb")
binfile.write(respHtml);
binfile.close();
5. 執行完畢后(時間可能會比較長),就可以在文件夾里面看到一張一張的圖片都下載完畢。再這里注意的是防止出現反爬蟲,可以用設置header或者代理等方式。
沒有設置一些header等參數時,有時會出現如下這種情況,這種情況應該是網站有反爬蟲的機制。
源碼項目github地址 : https://github.com/panacena/mmPictures/
這是本人學習python后寫的一個小例子。代碼寫的很爛。以后會學習Scrapy等框架然后在重新重構一下代碼。希望可以給個star~~~。
下載完后的圖片大概有36228 張圖片。