python用for循环读取图片_python 使用for循环简单爬取图片(1)
現(xiàn)在的網(wǎng)站大多做了反爬處理,找一個能爬的網(wǎng)站還真不容易。
下面開始一步步實現(xiàn):
1.簡單爬錄目圖片
1 importurllib.request2 importre3
4 defgethtml(url):5 page=urllib.request.urlopen(url)6 html=page.read().decode('utf-8')7
8 returnhtml9
10 defgetimg(html):11
12 a=re.compile(r'src="(.+?\.jpg)"')13 tp=a.findall(html)14 x=015
16 for img intp: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循環(huán)遍歷,針對我們的目標(biāo),我們要盡可能仔細觀察它的規(guī)律。
這里我們隨便點進去一個圖片集,如圖:
打開后看到該圖片集一共是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”
我們可以發(fā)現(xiàn)規(guī)律,這里直接改一下'_'后面的數(shù)字,這里就需要for循環(huán)了
2,源代碼的規(guī)律:
這里我們用正則表達式就應(yīng)該稍作修改:
應(yīng)該這樣寫:r'src="(.+?\.jpg)" /'
好了,下面就開始代碼實現(xiàn):
importurllib.requestimportredefgethtml(url):
page=urllib.request.urlopen(url)
html=page.read().decode('utf-8')returnhtmldefgetimg(html):
a=re.compile(r'src="(.+?\.jpg)" /')
b=a.findall(html)for img inb:
urllib.request.urlretrieve(img,'d:/tupian/%s.jpg' %x)
x=0for 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+=1getimg(html)
1.這里有很多值得我們研究的問題比如第一頁的url跟其他頁的url有出入,所以我們應(yīng)該想辦法把第一頁的圖片也加進去,大家可以用if函數(shù)實現(xiàn)
看代碼吧
2.關(guān)于urlretrieve()函數(shù),在保存下載路徑的時候要寫出全路徑,這里的
urllib.request.urlretrieve(img,'d:/tupian/%s.jpg' %x)就應(yīng)該做出變化了,我們可以理解一下,在第一個代碼中,
我們將 x 這個函數(shù)直接定義在函數(shù)中,但那是在爬取一個網(wǎng)頁下的所有圖片,可我們的第二個代碼是爬取每個頁面下的一張圖片,如果我們還是將 x 定義在函數(shù)中,那么就會出現(xiàn)一個問題,在文件夾中只會爬到一張圖片
大家可以想想原因,
其實當(dāng)我們用for循環(huán)遍歷所有url時,getimg()函數(shù)是被一遍遍調(diào)用的,當(dāng)?shù)谝粋€url下的圖片被爬下來后,它的名稱是 0.jpg 那么下一次下一個頁面爬到的圖片也將被命名為0.jpg
這樣系統(tǒng)就只會默認的保存一張圖片,所以我們在命名的時候應(yīng)該注意這一點,
只需要將 x 的初始值定義在for循環(huán)的外面就可以了
參考:https://my.oschina.net/talentwang/blog/48524
3.一個圖集的圖片實在不能滿足我們。
一般來說,我們可以通過觀察頁面url的規(guī)律來推出下一個url的地址,可我接下來觀察了幾個連續(xù)圖集中的url的信息
28426
28429
28435
28438
28443
28445
28456
28461
本人數(shù)學(xué)不好,實在發(fā)現(xiàn)不了規(guī)律,其實在每個圖集的下方都會給下一個圖集的鏈接,這就給我們提供了思路,大家如果在爬取某個頁面時遇到這種問題,不妨試一下
好了開始我們的代碼實現(xiàn)了:下面僅僅是獲取下個圖集的url地址的代碼,其余的下次補全:
importurllib.requestimportrefrom bs4 importBeautifulSoupdefgethtml(url):
page=urllib.request.urlopen(url)
html=page.read().decode('utf-8')
soup=BeautifulSoup(html,'html.parser')returnsoupdefgetimg(html):
b=html.find_all("div",{"class":"descriptionBox"})
href=re.compile(r'下一篇:')
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)
運行可以看到它已經(jīng)可以成功的打印出下一個圖集的html頁面源代碼。
之后再把所有代碼總結(jié)一下,
今天就寫到這,(明天繼續(xù))
與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的python用for循环读取图片_python 使用for循环简单爬取图片(1)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hive 分区_Hive下数据仓库历史拉
- 下一篇: python的类程序的结构_python