python爬取網頁圖片
㈠ 一個爬取wallhaven圖片的爬蟲
暑假在家閑來無事,自學了一番python編程,花上幾天時間,親手製作了一個爬蟲。
具體實現上,這個爬蟲的核心是使用了三個主要函數:mainControl、GetHtmlPack 和 downLoad。它們分別負責控製程序流程、解析網頁內容以及下載圖片。
起始步驟,從wallhaven.cc網站入手,查看鏈接結構,注意到搜索關鍵詞後跟在q後面,每翻一頁,page參數後跟著頁數。
由此構建出特定鏈接格式,進一步深入觀察圖片鏈接,發現href為'https://wallhaven.cc/w/{}'。但該鏈接並非最終圖像地址。深入剖析,得知最終圖像鏈接由'https://w.wallhaven.cc/full/{圖片id前兩位}/wallhaven-{圖片id}'加上png或jpg組成。
因此,首先通過'https://wallhaven.cc/search?q={}&page={}'進行鏈接解析,利用BeautifulSoup的find_all方法檢索所有包含a標簽的html文本,並設置attrs參數篩選條件。利用re.compile生成Pattern對象匹配所需圖片id,遍歷所有鏈接並進行解析。
使用downLoad函數解析出最終圖片鏈接並完成下載,同時,通過checkHttps函數判斷文件後綴,確保下載的圖片格式正確。
編寫完成的爬蟲頗有成就感,但尚有改進空間,例如多線程下載功能等。嘗試製作爬蟲,不僅能夠學習編程技能,還能獲得實際應用的成就感。
㈡ python爬圖片最多可以下載多少張(利用Python批量爬取網頁圖片)
導讀:本篇文章首席CTO筆記來給大家介紹有關python爬圖片最多可以下載多少張的相關內容,希望對大家有所幫助,一起來看看吧。
python:爬圖並下載到本地指定文件夾(爬圖片簡易版)
環境:python3IDLE
(ps:其他網站注意圖片懶載入與分頁等問題)
python多線程作用總結起來,使用多線程編程具有如下幾個優點:
進程之間不能共享內存,但線程之間共享內存非常容易。
操作系統在創建進程時,需要為該進程重新分配系統資源,但創建線程的代價則小得多。因此,使用多線程來實現多任務並發執行比使用多進程的效率高。
Python語言內置了多線程功能支持,而不是單純地作為底層操作系統的調度方式,從而簡化了Python的多線程編程。
在實際應用中,多線程是非常有用的。比如一個瀏覽器必須能同時下載多張圖片;一個Web伺服器必須能同時響應多個用戶請求;圖形用戶界面(GUI)應用也需要啟動單獨的線程,從主機環境中收集用戶界面事件……總之,多線程在實際編程中的應用是非常廣泛的。
怎樣用python爬新浪微博大V所有數據
我是個微博重度用戶,工作學習之餘喜歡刷刷timeline看看有什麼新鮮事發生,也因此認識了不少高質量的原創大V,有分享技術資料的,比如好東西傳送門;有時不時給你一點人生經驗的,比如石康;有高產的段子手,比如銀教授;有黃圖黃段子小能手,比如阿良哥哥?木木蘿希木?初犬餅…
好吧,我承認,爬黃圖黃段子才是我的真實目的,前三個是掩人耳目的…(捂臉,跑開)
另外說點題外話,我一開始想使用SinaWeiboAPI來獲取微博內容,但後來發現新浪微博的API限制實在太多,大家感受一下:
只能獲取當前授權的用戶(就是自己),而且只能返回最新的5條,WTF!
所以果斷放棄掉這條路,改為『生爬』,因為PC端的微博是Ajax的動態載入,爬取起來有些困難,我果斷知難而退,改為對移動端的微博進行爬取,因為移動端的微博可以通過分頁爬取的方式來一次性爬取所有微博內容,這樣工作就簡化了不少。
最後實現的功能:
輸入要爬取的微博用戶的user_id,獲得該用戶的所有微博
文字內容保存到以%user_id命名文本文件中,所有高清原圖保存在weibo_image文件夾中
具體操作:
首先我們要獲得自己的cookie,這里只說chrome的獲取方法。
用chrome打開新浪微博移動端
option+command+i調出開發者工具
點開Network,將Preservelog選項選中
輸入賬號密碼,登錄新浪微博
找到m.weibo.cn-Headers-Cookie,把cookie復制到代碼中的#yourcookie處
cookie
然後再獲取你想爬取的用戶的user_id,這個我不用多說啥了吧,點開用戶主頁,地址欄裡面那個號碼就是user_id
將python代碼保存到weibo_spider.py文件中
定位到當前目錄下後,命令行執行pythonweibo_spider.pyuser_id
當然如果你忘記在後面加user_id,執行的時候命令行也會提示你輸入
最後執行結束
iTerm
小問題:在我的測試中,有的時候會出現圖片下載失敗的問題,具體原因還不是很清楚,可能是網速問題,因為我宿舍的網速實在太不穩定了,當然也有可能是別的問題,所以在程序根目錄下面,我還生成了一個userid_imageurls的文本文件,裡面存儲了爬取的所有圖片的下載鏈接,如果出現大片的圖片下載失敗,可以將該鏈接群一股腦導進迅雷等下載工具進行下載。
另外,我的系統是OSXEICapitan10.11.2,Python的版本是2.7,依賴庫用sudopipinstallXXXX就可以安裝,具體配置問題可以自行stackoverflow,這里就不展開講了。
下面我就給出實現代碼(嚴肅臉)
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
??
#-*-coding:utf8-*-
importre
importstring
importsys
importos
importurllib
importurllib2
frombs4importBeautifulSoup
importrequests
fromlxmlimportetree
reload(sys)
sys.setdefaultencoding('utf-8')
if(len(sys.argv)=2):
user_id=(int)(sys.argv[1])
else:
user_id=(int)(raw_input(u"請輸入user_id:"))
cookie={"Cookie":"#yourcookie"}
url='d?filter=1page=1'%user_id
html=requests.get(url,cookies=cookie).content
selector=etree.HTML(html)
pageNum=(int)(selector.xpath('//input[@name="mp"]')[0].attrib['value'])
result=""
urllist_set=set()
word_count=1
image_count=1
printu'爬蟲准備就緒...'
forpageinrange(1,pageNum+1):
#獲取lxml頁面
url='hu/%d?filter=1page=%d'%(user_id,page)
lxml=requests.get(url,cookies=cookie).content
#文字爬取
selector=etree.HTML(lxml)
content=selector.xpath('//span[@class="ctt"]')
foreachincontent:
text=each.xpath('string(.)')
ifword_count=4:
text="%d:"%(word_count-3)+text+" "
else:
text=text+" "
result=result+text
word_count+=1
#圖片爬取
soup=BeautifulSoup(lxml,"lxml")
urllist=soup.find_all('a',href=re.compile(r'^mblog/oripic',re.I))
first=0
forimgurlinurllist:
urllist_set.add(requests.get(imgurl['href'],cookies=cookie).url)
image_count+=1
fo=open("/Users/Personals/%s"%user_id,"wb")
fo.write(result)
word_path=os.getcwd()+'/%d'%user_id
printu'文字微博爬取完畢'
link=""
fo2=open("/Users/Personals/%s_imageurls"%user_id,"wb")
foreachlinkinurllist_set:
link=link+eachlink+" "
fo2.write(link)
printu'圖片鏈接爬取完畢'
ifnoturllist_set:
printu'該頁面中不存在圖片'
else:
#下載圖片,保存在當前目錄的pythonimg文件夾下
image_path=os.getcwd()+'/weibo_image'
ifos.path.exists(image_path)isFalse:
os.mkdir(image_path)
x=1
forimgurlinurllist_set:
temp=image_path+'/%s.jpg'%x
printu'正在下載第%s張圖片'%x
try:
urllib.urlretrieve(urllib2.urlopen(imgurl).geturl(),temp)
except:
printu"該圖片下載失敗:%s"%imgurl
x+=1
printu'原創微博爬取完畢,共%d條,保存路徑%s'%(word_count-4,word_path)
printu'微博圖片爬取完畢,共%d張,保存路徑%s'%(image_count-1,image_path)
??
Python3.xx中寫爬蟲,下載圖片除了urlretrieve方法,還有什麼庫的什麼方法呢?Part1.urllib2
urllib2是Python標准庫提供的與網路相關的庫,是寫爬蟲最常用的一個庫之一。
想要使用Python打開一個網址,最簡單的操作即是:
your_url=""html=urllib2.urlopen(your_url).read()12
這樣所獲得的就是對應網址(url)的html內容了。
但有的時候這么做還不夠,因為目前很多的網站都有反爬蟲機制,對於這么初級的代碼,是很容易分辨出來的。例如本文所要下載圖片的網站,上述代碼會返回HTTPError:HTTPError403:Forbidden錯誤。
那麼,在這種情況下,下載網路圖片的爬蟲(雖然只有幾行代碼,但一個也可以叫做爬蟲了吧,笑),就需要進一步的偽裝。
要讓爬蟲偽裝成瀏覽器訪問指定的網站的話,就需要加入消息頭信息。所謂的消息頭信息就是在瀏覽器向網路伺服器發送請求時一並發送的請求頭(RequestHeaders)信息和伺服器返回的響應頭(ResponseHeaders)信息。
例如,使用FireFox打開時所發送的RequestHeaders的部分內容如下:
Host:"publicdomainarchive.com/"User-Agent:"Mozilla/5.0(WindowsNT10.0;WOW64;rv:50.0)Gecko/20100101Firefox/50.0"Accept:"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"...1234
還有一些其他屬性,但其中偽裝成瀏覽器最重要的部分已經列出來了,即User-Agent信息。
要使用Headers信息,就不能再僅僅向urlopen方法中傳入一個地址了,而是需要將HTTPRequest的Headers封裝後傳入:
headers={'User-Agent':'Mozilla/5.0(WindowsNT10.0;WOW64;rv:50.0)Gecko/20100101Firefox/50.0'}req=urllib2.Request(url=url,headers=headers)content=urllib2.urlopen(req).read()123
這樣,就獲得了網站的html內容。
接下來,就需要從html去獲取圖片的鏈接。
Part2.HTMLParser
HTMLParser是Python提供的HTML解析庫之一。
但Python提供的這個類中很多方法都沒有實現,因而基本上這個庫只負責進行解析,但解析完了什麼都不做。所以如果需要對HTML中的某些元素進行加工的話,就需要用戶自己去實現其中的一些方法。本文僅實現其中的handle_starttag方法:
classMyHTMLParser(HTMLParser):#繼承HTMLParser類
def__init__(self):#初始化
HTMLParser.__init__(self)defhandle_starttag(self,tag,attrs):
#參數tag即由HTMLParser解析出的開始標簽,attrs為該標簽的屬性
iftag=="img":#下載圖片所需要的img標簽
iflen(attrs)==0:pass
else:for(variable,value)inattrs:#在attrs中找到src屬性,並確定其是我們所要下載的圖片,最後將圖片下載下來(這個方法當然也有其他的寫法)
ifvariable=="src"andvalue[0:4]=='http'andvalue.find('x')=0:
pic_name=value.split('/')[-1]printpic_name
down_image(value,pic_name)123456789101112131415
Part3.下載圖片
從handle_starttag方法中,我們已經獲得了圖片的url,那麼,最後一步,我們要下載圖片了。
當然,要獲得網路上的圖片,自然也需要向伺服器發送請求,一樣需要用到urllib2這個庫,也需要用到上面所用到的請求頭。
以下是down_image()方法的主要代碼:
binary_data=urllib2.urlopen(req).read()
temp_file=open(file_name,'wb')
temp_file.write(binary_data)
temp_file.close()1234
因為這次打開的網址是個圖片,所以urllib2.urlopen(req).read()所獲取的就是圖片的數據,將這些數據需要以二進制的方式寫入本地的圖片文件,即將圖片下載下來了。
因為圖片的url的最後一部分是圖片的名字,所以可以直接用做本地的文件名,不用擔心命名沖突,也不用擔心後綴不符,很是方便。
Part4.getFreeImages.py
這個下載圖片的腳本的完整代碼如下:
importurllib2,
classMyHTMLParser(HTMLParser):
def__init__(self):
HTMLParser.__init__(self)#self.links={}
defhandle_starttag(self,tag,attrs):
#print"Encounteredthebeginningofa%stag"%tag
iftag=="img":iflen(attrs)==0:pass
else:for(variable,value)inattrs:ifvariable=="src"andvalue[0:4]=='http'andvalue.find('x')=0:
pic_name=value.split('/')[-1]printpic_name
down_image(value,pic_name)defdown_image(url,file_name):
globalheaders
req=urllib2.Request(url=url,headers=headers)
binary_data=urllib2.urlopen(req).read()
temp_file=open(file_name,'wb')
temp_file.write(binary_data)
temp_file.close()if__name__=="__main__":
img_dir="D:\Downloads\domainimages"
ifnotos.path.isdir(img_dir):
os.mkdir(img_dir)
os.chdir(img_dir)printos.getcwd()
url=""
headers={'User-Agent':'Mozilla/5.0(WindowsNT10.0;WOW64;rv:50.0)Gecko/20100101Firefox/50.0'}
all_links=[]
hp=MyHTMLParser()foriinrange(1,30):
url=''+str(i)+'/'
req=urllib2.Request(url=url,headers=headers)
content=urllib2.urlopen(req).read()
hp.feed(content)
hp.close()041424344454647484950
有大神知道怎麼使用python往ftp伺服器上連續上傳下載多張圖片嗎?例:下載、上傳文件
#?coding:?utf-8
from?ftplib?import?FTP
import?time
import?tarfile
import?os
#?!/usr/bin/python
#?-*-?coding:?utf-8?-*-
from?ftplib?import?FTP
def?ftpconnect(host,?username,?password):
????ftp?=?FTP()
????#?
????(host,?21)
????(username,?password)
????return?ftp
#從ftp下載文件
def?downloadfile(ftp,?remotepath,?localpath):
????bufsize?=?1024
????fp?=?open(localpath,?'wb')
????('RETR?'?+?remotepath,?fp.write,?bufsize)
????
????fp.close()
#從本地上傳文件到ftp
def?uploadfile(ftp,?remotepath,?localpath):
????bufsize?=?1024
????fp?=?open(localpath,?'rb')
????('STOR?'?+?remotepath,?fp,?bufsize)
????
????fp.close()
if?__name__?==?"__main__":
????ftp?=?ftpconnect("113.105.139.xxx",?"ftp***",?"Guest***")
????downloadfile(ftp,?"Faint.mp4",?"C:/Users/Administrator/Desktop/test.mp4")
????#調用本地播放器播放下載的視頻
????os.system('start?"C:Program?FilesWindows?Media?Playerwmplayer.exe"?"C:/Users/Administrator/Desktop/test.mp4"')
????uploadfile(ftp,?"C:/Users/Administrator/Desktop/test.mp4",?"test.mp4")
????
Python爬蟲爬坑路(二)——B站圖片,咸魚的正確GET姿勢昨天在寫完入門級爬蟲之後,馬上就迫不及待的著手開始寫B站的圖片爬蟲了,真的很喜歡這個破站呢(? ̄△ ̄)?
這里不涉及到Python爬蟲的高級技
㈢ 如何用Python做爬蟲
在我們日常上網瀏覽網頁的時候,經常會看到一些好看的圖片,我們就希望把這些圖片保存下載,或者用戶用來做桌面壁紙,或者用來做設計的素材。
我們最常規的做法就是通過滑鼠右鍵,選擇另存為。但有些圖片滑鼠右鍵的時候並沒有另存為選項,還有辦法就通過就是通過截圖工具截取下來,但這樣就降低圖片的清晰度。好吧其實你很厲害的,右鍵查看頁面源代碼。
我們可以通過python來實現這樣一個簡單的爬蟲功能,把我們想要的代碼爬取到本地。下面就看看如何使用python來實現這樣一個功能。