1. 程式人生 > >記錄一次python爬蟲批量下載一個校花網站的妹子圖片

記錄一次python爬蟲批量下載一個校花網站的妹子圖片

學python也快2個禮拜了,從開始看別人寫的爬蟲程式碼,然後試著抄著學習,感覺沒太大進步,最大收穫就是改了幾處bug(可能有些地方不適用我的pyyhon平臺報錯)。

中午看到一個帖子校花妹子圖使用爬蟲進行批量下載,看了下,感覺不錯(我說的技術,哈哈哈)。

然後決定自己寫一個爬蟲,已經看書兩個禮拜了,也要練一練了。

宣告:程式碼寫的不怎麼好,大神別嫌棄,可以給些建議。

先來點圖片養個眼,提升下動力。


這個是批量下載的一個妹子的圖片。

開始爬蟲:本次使用的環境是linux-ubantu,python3。

import urllib.request
from bs4 import BeautifulSoup
import requests

先獲取頁面連結內容

get_url = urllib.request.Request(url, headers)
res = urllib.request.urlopen(get_url).read()

res是獲取的html網頁。使用python的現成庫BeautifulSoup去進行搜尋。先去網頁F12分析:

如下圖:


我畫紅框的那兩個關鍵點,第一個是圖片的list表,從這裡可以獲取每一個校花的列表。

soup = BeautfulSoup(res, "html.parser")
pict_list = soup.find('div', id='list_img').find_all('a', target='_blank')

獲取完的資訊是下面這樣的,可以看出一個校花的資訊出現了兩次,那就寫一個判斷的每次只取一個(方法簡單不單獨寫了,所有程式碼附在最後)

find方法找到一整個列表, find_all方法發現每個校花的詳細資訊。

第二個烈表示其中之一校花的網頁連結,通過這個連結可以知道這個校花所有的圖片,然後開啟這個網頁,再針對單個校花進行分析:看圖


分析得出:每張妹子圖都在div的class =="p-tmb"中間,使用find_all方法找出所有的,然後單獨找出每一張的圖片所在的資訊行,使用find找出來。

soup = BeautifulSoup(ret_girl_url, "html.parser")
picture = soup.find_all('div', class_='p-tmb')

仔細看,jpg格式的連結,是不完整的,自己把頭部加一下,頭部就是這個網頁的首頁地址。

獲得了這麼多資訊,就可以直接進行下載儲存了


這就下載好了,下載好的圖片在一開始就已經展示了,在這裡就不再展示了,把原始碼附在這裡,想學習的可以看看,也可以給點建議,共同進步。

import urllib.request
from bs4 import BeautifulSoup
import requests

headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102UBrowser/6.1.2107.204 Safari/537.36'}

url_list = []
def get_href(url):
    if url in url_list:
        return None
    else:
        url_list.append(url)
        return url

def down_pic(url):
    r = requests.get(url, headers)
    name = url[-10:-4]
    print(name)
    with open(name+'.jpg', 'wb') as f:
        for chunk in r.iter_content(1024):
            if chunk:
                f.write(chunk)

def get_url_list(url):
    get_url = urllib.request.Request(url, headers=headers)
    res = urllib.request.urlopen(get_url).read() 
    soup = BeautifulSoup(res, "html.parser")
    pict_list = soup.find('div', id='list_img').find_all('a', target='_blank')
    return pict_list

def get_new_url(content):
    html = content['href']
    new_url = get_href(html)
    if new_url == None:
        return None
    else:
        return new_url
def get_picture_url_info(url):
    girl_url = urllib.request.Request(url, headers=headers)
    ret_girl_url = urllib.request.urlopen(girl_url).read()
    soup = BeautifulSoup(ret_girl_url, "html.parser")
    picture = soup.find_all('div', class_='p-tmb')
    return picture

def get_addr(girl_url):
    tmp = girl_url.find('img')
    addr = tmp['src']
    www = "http://www.xiaohuar.com"
    return www+addr

def start():
    url = 'http://www.xiaohuar.com/list-1-\d+.html'
    lst = get_url_list(url)
    for line in lst:
        new_url = get_new_url(line)
        if new_url == None:
            continue
        info = get_picture_url_info(new_url)
        for girl in info:
            addr = get_addr(girl)
            print('addr:', addr)
            down_pic(addr)
        break

if __name__ == '__main__':
    start()