現在的網站大多做了反爬處理,找一個能爬的網站還真不容易。
下面開始一步步實現:
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頁面源代碼。
之后再把所有代碼總結一下,
今天就寫到這,(明天繼續)
