本文目錄一覽:
- 1、如何用python實現爬取微博相冊所有圖片?
- 2、linux下python怎麼寫爬蟲獲取圖片
- 3、使用python爬取網頁,獲取不到圖片地址
- 4、python爬蟲如何創建image文件夾
- 5、python爬取圖片時忽略了一些圖片
- 6、怎麼使用python扒網上的照片
如何用python實現爬取微博相冊所有圖片?
三種方案:
1.直接用Python的requests庫直接爬取,不過這個需要手動做的事情就比較多了,基本上就看你的Python功力了
2.使用scrapy爬蟲框架,這個框架如果不熟悉的話只能自己先去了解下這個框架怎麼用
3.使用自動測試框架selemium模擬登錄操作,及圖片爬取,這個對於大多數會點Python編碼的人來說是最好的選擇了,他比較直觀的能看到怎麼去獲取數據
每種方案的前提都是你必須有一定基礎的編碼能力才行,不是隨便一個人就能用的
linux下python怎麼寫爬蟲獲取圖片
跟linux有什麼關係,python是跨平台的,爬取圖片的代碼如下:
import urllib.requestimport osimport randomdef url_open(url):
req=urllib.request.Request(url) #為請求設置user-agent,使得程序看起來更像一個人類
req.add_header(‘User-Agent’,’Mozilla/5.0 (Windows NT 6.1; WOW64; rv:43.0) Gecko/20100101 Firefox/43.0′) #代理IP,使用戶能以不同IP訪問,從而防止被服務器發現
”’iplist=[‘1.193.162.123:8000′,’1.193.162.91:8000′,’1.193.163.32:8000’]
proxy_support=urllib.request.ProxyHandler({‘http’:random.choice(iplist)})
opener=urllib.request.build_opener(proxy_support)
opener.addheaders=[(‘User-Agent’,’Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.154 Safari/537.36 LBBROWSER’)]
urllib.request.install_opener(opener)”’
response=urllib.request.urlopen(req)
html=response.read() return htmldef get_page(url):
html=url_open(url).decode(‘utf-8’)
a=html.find(‘current-comment-page’)+23
b=html.find(‘]’,a) #print(html[a:b])
return html[a:b]def find_imgs(url):
html=url_open(url).decode(‘utf-8’)
img_addrs=[]
a=html.find(‘img src=’) while a!=-1:
b=html.find(‘.jpg’,a,a+140) if b!=-1: if html[a+9]!=’h’:
img_addrs.append(‘http:’+html[a+9:b+4]) else:
img_addrs.append(html[a+9:b+4]) else:
b=a+9
a=html.find(‘img src=’,b) for each in img_addrs:
print(each+’我的打印’) return img_addrsdef save_imgs(folder,img_addrs):
for each in img_addrs: #print(‘one was saved’)
filename=each.split(‘/’)[-1] with open(filename,’wb’) as f:
img=url_open(each)
f.write(img)def download_mm(folder=’ooxx’,pages=10):
os.mkdir(folder)
os.chdir(folder)
url=””
page_num=int(get_page(url)) for i in range(pages):
page_num=page_num-1
page_url=url+’page-‘+str(page_num)+’#comments’
img_addrs=find_imgs(page_url)
save_imgs(folder,img_addrs)if __name__==’__main__’:
download_mm()1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
完成
運行結果
使用python爬取網頁,獲取不到圖片地址
這個大圖片是在點擊之後用 JS 控制加載的。
你可以看看 js/js.js 這個文件,253 行:
function changeImg(){
jQuery(“#bitImg”).attr(‘src’,’p/p’+pictID+’/’+indexNum+’.’+jpgPng);
}
其實大圖的規律很好找, 下面縮略圖列表的 src 可以用 #variContent li img 取到,可以在源碼中的 107 行找到:
view-source:
縮略圖列表地址長這樣:
/p/p0997/tn/1.jpg
/p/p0997/tn/2.jpg
/p/p0997/tn/3.jpg
…
如果要獲取大圖,只要去掉“tn”這一段就可以:
/p/p0997/1.jpg
/p/p0997/2.jpg
/p/p0997/3.jpg
…
然後拼接域名在前面,GET 下來就是大圖,比如第一個大圖鏈接:
第一個大圖地址
不過,你如果僅僅只是想要抓那個站的全部素材,窮舉“p0997”這一段的序號(比如改成“p0098”,這個應該是圖集的 ID),並且遍歷最後一段的圖片序號,擴展名可能是 jpg 也可能是 png,從 1 開始(“1.jpg”,“2.jpg”…)直到返回 404 停止。
思路大概是這麼個思路,不過話說回來,你這麼爬人家素材真的道德嗎?
python爬蟲如何創建image文件夾
有自動創建功能,也可以使用代碼。1.觀察網頁,找到img標籤;2.通過requests和BS庫來提取網頁中的img標籤;3.抓取
_mg標籤後,再把裡面的src給提取出來,接下來就可以下載圖片了;
?
?4.通過urllib的urllib.urlretrieve來下載圖片並且放進文件夾裡面(第一之前的準備工作就是獲取當前路徑然後新建一個文件夾);
?5.如果有多張圖片,不斷的重複3-4。
python爬取圖片時忽略了一些圖片
真實圖片地址是在客戶端javascript代碼中計算出來的.
你需要尋找
span class=”img-hash”Ly93dzMuc2luYWltZy5jbi9tdzYwMC8wMDczdExQR2d5MWZ3Z3h6ajlrMGtqMzBpYjBramtnaS5qcGc=/span
這樣的內容,取出
Ly93dzMuc2luYWltZy5jbi9tdzYwMC8wMDczdExQR2d5MWZ3Z3h6ajlrMGtqMzBpYjBramtnaS5qcGc=
這段內容,做base64解碼即得圖片地址。
相應的腳本在
//cdn.jandan.net/static/min/91798e4c623fa60181a31d543488217eB2GDr79r.03100001.js
這段內容你通過get_page()爬到地頁面中有,同樣,該頁面中有這樣的html(為便於閱讀已重排格式):
div class=”text”
span class=”righttext”
a href=”//jandan.net/ooxx/page-34#comment-4001800″4001800/a
/span
p
img src=”//img.jandan.net/img/blank.gif” onload=”jandan_load_img(this)” /
span class=”img-hash”Ly93dzMuc2luYWltZy5jbi9tdzYwMC8wMDczdExQR2d5MWZ3Z3h6ajlrMGtqMzBpYjBramtnaS5qcGc=/span
/p
/div
這個img的onload調用的函數就在前面給出的那個js文件中:
function jandan_load_img(b){
var d=$(b);
var f=d.next(“span.img-hash”);
var e=f.text();
f.remove();
var c=jdDw3Ldvi4NcbKboi4X19hCAmdC3Q3aZvN(e,”DGmLfT4H73yJdXXpXs3pw7uAiICcflZS”);
var a=$(‘a href=”‘+c.replace(/(\/\/\w+\.sinaimg\.cn\/)(\w+)(\/.+\.(gif|jpg|jpeg))/,”$1large$3″)+
‘” target=”_blank” class=”view_img_link”[查看原圖]/a’);
d.before(a);
d.before(“br”);
d.removeAttr(“onload”);
d.attr(“src”,location.protocol+c.replace(/(\/\/\w+\.sinaimg\.cn\/)(\w+)(\/.+\.gif)/,”$1thumb180$3″));
if(/\.gif$/.test(c)){
d.attr(“org_src”,location.protocol+c);
b.onload=function(){
add_img_loading_mask(this,load_sina_gif)
}
}
它調用了jdDw3Ldvi4NcbKboi4X19hCAmdC3Q3aZvN對img-hash的內容做解碼,這個函數同樣在這個js文件中:
var jdDw3Ldvi4NcbKboi4X19hCAmdC3Q3aZvN=function(o,y,g){
var d=o;var l=”DECODE”;
var y=y?y:””;
var g=g?g:0;
var h=4;
y=md5(y);
var x=md5(y.substr(0,16));
var v=md5(y.substr(16,16));
…中間部分略去…
if(l==”DECODE”){
m=base64_encode(m);
var c=new RegExp(“=”,”g”);
m=m.replace(c,””);
m=u+m;
m=base64_decode(d)
}
return m
};
你只需要在Python使用相應的庫對抓取到的img-hash內容做解碼即可得到圖片地址。
你使用了str的find來從文本中定位位置,這樣做太麻煩了,太多的代碼細節,使用re模塊做正則匹配就簡單很多,更快的是直接使用現有的爬蟲庫.
使用re進行正則匹配,只需要使用正則式’span class=”img-hash”(.+?)’即可提取出該頁面中所有加密的圖片地址。
import re
import base64
pat = re.compile(‘span class=”img-hash”(.+?)’)
…
def get_imgurls(url):
urls = []
for imgurl in pat.findall(url_open(url).decode(‘utf-8’)):
.append(str(base64.b64decode(imgurl), ‘utf-8’))
return urls
然後就可以對get_imgurls返回的列表遍歷,逐個交給save_img處理了。
使用爬取庫也只需要尋找span,從中找出class=’img-hash’即可讀取text。
怎麼使用python扒網上的照片
# coding=utf-8
# 聲明編碼方式 默認編碼方式ASCII
import urllib
import time
import re
import os
””’
Python下載游迅網圖片 BY:Eastmount
”’
””’
**************************************************
#第一步 遍歷獲取每頁對應主題的URL
**************************************************
”’
fileurl=open(‘yxdown_url.txt’,’w’)
fileurl.write(‘****************獲取游訊網圖片URL*************\n\n’)
#建議num=3 while num=3一次遍歷一個頁面所有主題,下次換成num=4 while num=4而不是1-75
num=3
while num=3:
temp = ”+str(num)+’.html’
content = urllib.urlopen(temp).read()
open(‘yxdown_’+str(num)+’.html’,’w+’).write(content)
print temp
fileurl.write(‘****************第’+str(num)+’頁*************\n\n’)
#爬取對應主題的URL
#div class=”cbmiddle”/div中a target=”_blank” href=”/html/5533.html”
count=1 #計算每頁1-75中具體網頁個數
res_div = r’div class=”cbmiddle”(.*?)/div’
m_div = re.findall(res_div,content,re.S|re.M)
for line in m_div:
#fileurl.write(line+’\n’)
#獲取每頁所有主題對應的URL並輸出
if “_blank” in line: #防止獲取列表list/1_0_1.html list/2_0_1.html
#獲取主題
fileurl.write(‘\n\n********************************************\n’)
title_pat = r’b class=”imgname”(.*?)/b’
title_ex = re.compile(title_pat,re.M|re.S)
title_obj = re.search(title_ex, line)
title = title_obj.group()
print unicode(title,’utf-8′)
fileurl.write(title+’\n’)
#獲取URL
res_href = r’a target=”_blank” href=”(.*?)”‘
m_linklist = re.findall(res_href,line)
#print unicode(str(m_linklist),’utf-8′)
for link in m_linklist:
fileurl.write(str(link)+’\n’) #形如”/html/5533.html”
””’
**************************************************
#第二步 去到具體圖像頁面 下載HTML頁面
#注意先本地創建yxdown 否則報錯No such file or directory
**************************************************
”’
#下載HTML網頁無原圖 故加’#p=1’錯誤
#HTTP Error 400. The request URL is invalid.
html_url = ”+str(link)
print html_url
html_content = urllib.urlopen(html_url).read() #具體網站內容
#可注釋它 暫不下載靜態HTML
open(‘yxdown/yxdown_html’+str(count)+’.html’,’w+’).write(html_content)
””’
#第三步 去到圖片界面下載圖片
#點擊”查看原圖”HTML代碼如下
#a href=”javascript:;” style=””onclick=”return false;”查看原圖/a
#通過JavaScript實現 而且該界面存儲所有圖片鏈接script/script之間
”’
html_script = r’script(.*?)/script’
m_script = re.findall(html_script,html_content,re.S|re.M)
for script in m_script:
res_original = r'”original”:”(.*?)”‘ #原圖
m_original = re.findall(res_original,script)
for pic_url in m_original:
print pic_url
fileurl.write(str(pic_url)+’\n’)
””’
#第四步 下載圖片
#如果瀏覽器存在驗證信息如維基百科 需添加如下代碼
class AppURLopener(urllib.FancyURLopener):
version = “Mozilla/5.0”
urllib._urlopener = AppURLopener()
”’
filename = os.path.basename(pic_url) #去掉目錄路徑,返迴文件名
#No such file or directory 需要先創建文件Picture3
urllib.urlretrieve(pic_url, ‘E:\\Picture3\\’+filename)
#IOError: [Errno socket error] [Errno 10060]
#只輸出一個URL 否則輸出兩個相同的URL
break
#當前頁具體內容個數加1
count=count+1
time.sleep(0.1)
else:
print ‘no url about content’
time.sleep(1)
num=num+1
else:
print ‘Download Over!!!’
原創文章,作者:XYM24,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/127692.html