python 使用for循環簡單爬取圖片(1)


現在的網站大多做了反爬處理,找一個能爬的網站還真不容易。

 下面開始一步步實現:

1.簡單爬錄目圖片

 1 import urllib.request
 2 import re
 3 
 4 def gethtml(url):
 5     page=urllib.request.urlopen(url)
 6     html=page.read().decode('utf-8')
 7 
 8     return html
 9 
10 def getimg(html):
11     
12     a=re.compile(r'src="(.+?\.jpg)"')
13     tp=a.findall(html)
14     x=0
15     
16     for img in tp:
17         urllib.request.urlretrieve(img,'d:/tupian/%s.jpg' % x)
18         x+=1
19 
20
21 url="http://www.meituba.com/yijing/28426.html"
22 
23 html=gethtml(url)
24 getimg(html)

2.爬圖集

這里僅僅是爬取了錄目上的圖片,還沒有涉及到for循環遍歷,針對我們的目標,我們要盡可能仔細觀察它的規律。

這里我們隨便點進去一個圖片集,如圖:

打開后看到該圖片集一共是6張,

分析一下它的url 和頁面的源代碼:

1,url分析

這里就不貼圖片了,我直接說吧

第一張圖片(也就是第一頁)的url=“http://www.meituba.com/yijing/28426.html”

第二張圖片的url=“http://www.meituba.com/yijing/28426_2.html”

。。。。。

第六頁圖片的url=“http://www.meituba.com/yijing/28426_6.html”

我們可以發現規律,這里直接改一下'_'后面的數字,這里就需要for循環了

2,源代碼的規律:

這里我們用正則表達式就應該稍作修改:

應該這樣寫:r'src="(.+?\.jpg)" /'

好了,下面就開始代碼實現:

import urllib.request
import re

def gethtml(url):
    page=urllib.request.urlopen(url)
    html=page.read().decode('utf-8')

    return html

def getimg(html):
    
    a=re.compile(r'src="(.+?\.jpg)" /')
    b=a.findall(html)
    
    
    for img in b:
        urllib.request.urlretrieve(img,'d:/tupian/%s.jpg' % x)


x=0
    
for i in range(1,7):

    if i==1:
        url="http://www.meituba.com/yijing/28426.html"
    else:
        url=("http://www.meituba.com/yijing/28426_%s.html" % i)

    html=gethtml(url)
    
    x+=1
    
    getimg(html)

 

 

1.這里有很多值得我們研究的問題比如第一頁的url跟其他頁的url有出入,所以我們應該想辦法把第一頁的圖片也加進去,大家可以用if函數實現

看代碼吧

2.關於urlretrieve()函數,在保存下載路徑的時候要寫出全路徑,這里的

      urllib.request.urlretrieve(img,'d:/tupian/%s.jpg' % x)

就應該做出變化了,我們可以理解一下,在第一個代碼中,
我們將 x 這個函數直接定義在函數中,但那是在爬取一個網頁下的所有圖片,可我們的第二個代碼是爬取每個頁面下的一張圖片,如果我們還是將 x 定義在函數中,那么就會出現一個問題,在文件夾中只會爬到一張圖片
大家可以想想原因,
其實當我們用for循環遍歷所有url時,getimg()函數是被一遍遍調用的,當第一個url下的圖片被爬下來后,它的名稱是 0.jpg 那么下一次下一個頁面爬到的圖片也將被命名為0.jpg
這樣系統就只會默認的保存一張圖片,所以我們在命名的時候應該注意這一點,
只需要將 x 的初始值定義在for循環的外面就可以了

參考:https://my.oschina.net/talentwang/blog/48524

 

3.一個圖集的圖片實在不能滿足我們。

 

一般來說,我們可以通過觀察頁面url的規律來推出下一個url的地址,可我接下來觀察了幾個連續圖集中的url的信息

28426
28429

28435
28438

28443
28445

28456
28461

本人數學不好,實在發現不了規律,其實在每個圖集的下方都會給下一個圖集的鏈接,這就給我們提供了思路,大家如果在爬取某個頁面時遇到這種問題,不妨試一下

好了開始我們的代碼實現了:下面僅僅是獲取下個圖集的url地址的代碼,其余的下次補全:

import urllib.request
import re
from bs4 import BeautifulSoup


def gethtml(url):
    page=urllib.request.urlopen(url)
    html=page.read().decode('utf-8')
    soup=BeautifulSoup(html,'html.parser')
    return soup

def getimg(html):
    
    b=html.find_all("div",{"class":"descriptionBox"})
    href=re.compile(r'<b>下一篇:</b><a href="(.+?\.html)">')
    c=href.findall(str(b))
    print(c)
    print(type(c))
    e="http://www.meituba.com"+('').join(c)
    print(e)
    d=urllib.request.urlopen(e)
    f=d.read().decode('utf-8')
    print(f)
url="http://www.meituba.com/yijing/28426.html"
soup=gethtml(url)
getimg(soup)

 運行可以看到它已經可以成功的打印出下一個圖集的html頁面源代碼。

之后再把所有代碼總結一下,

今天就寫到這,(明天繼續)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM