#
#author:wuhao
#
#爬取指定頁碼的圖片,如果需要爬取某一類的所有圖片,整體框架不變,但需要另作分析
#
可能寫的有點亂,因為這是我py寫的第一個爬蟲程序
思路理一下:適用於所有爬蟲,高級點的無非就是在我 以下所說的上面增加了點功能 ,比如代理 、 多線程、 死亡重連 等
思路:
本質上來講爬蟲就是 獲取網頁 然后解析網頁 獲取出自己需要的數據 然后對數據進行保存
1.需要解決的就是找到存儲 你所需資源的網頁 url 【滿足一定規律】,因為你不可能沒爬去一張網頁 手動輸一次。
2.找到了url, 你所需要做的就是 以 get | 或 post 的方式獲取網頁資源,至於 get | post 怎么用,如果你不用框架的話【我建議不要用,因為框架也都是基於 urllib 實現的】,我推薦你去官網上看一下 urllib urllib2 模塊,里面的API有詳細的使用說明。
3.如果第二步搞定了,說明你已經能夠獲取網頁資源了,那么你所需要的就是解析出資源了。 我一般是用 beautifulsoup 庫 和 regex 搭配使用 , beautifulsoup 是需要額外安裝的,他功能很強大,可以很快速的解析網頁結構。
4.第三步解決的話,你要做的就是存儲數據了,因為你爬數據,爬數據,如果不保存也沒什么用。
import urllib.request
import urllib.parse
import re
import os
#添加header,其中Referer是必須的,否則會返回403錯誤,User-Agent是必須的,這樣才可以偽裝成瀏覽器進行訪問
header=\
{ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36', "referer":"https://image.baidu.com" }
#由於百度圖片獲取的方式是采用ajax,所以你從正常的url鏈接只能提取到一個頁面顯示的圖片,也就是前30張(還是前60張)
#具體的分析是:你下拉頁面滾動條,分析XHR的變化,就可以找到所需要的Json數據,比如說這個就是分析后找的Json數據
https://image.baidu.com/search/acjson?tn=resultjson_com&ipn=rj&ct=201326592&is=&fp=result&queryWord=%E5%BE%AE%E8%B7%9D%E6%91%84%E5%BD%B1&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=-1&z=&ic=0&word=%E5%BE%AE%E8%B7%9D%E6%91%84%E5%BD%B1&s=&se=&tab=&width=&height=&face=0&istype=2&qc=&nc=1&fr=&pn=240&rn=30&gsm=b4&1492507141415=
#而這個鏈接中的的 rn 參數指的是一頁包含的圖片數量,最多60。 pn 指得是第多少張 word 指的是搜索的關鍵字,其它的一些參數是無關緊要的, 當然你需要把其轉碼
"https://image.baidu.com/search/acjson?tn=resultjson_com&ipn=rj&ct=201326592&is=&fp=result&queryWord={word}&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=-1&z=&ic=0&word={word}&s=&se=&tab=&width=&height=&face=0&istype=2&qc=&nc=1&fr=&cg=girl&pn={pageNum}&rn=30&gsm=1e00000000001e&1490169411926="
#keyword=input("請輸入搜索關鍵字:")
keyword='美女'
#轉換編碼格式
keyword=urllib.parse.quote(keyword,"utf-8")
#n作為一個flag,用於條件判斷
n=0
#j作為寫入圖片的識別標志,默認從第0張開始,每寫入一張j就+1
j=0
#
error=0
#獲取前3000張圖片
while(n<30*100):
n+=30 #url鏈接 url1=url.format(word=keyword,pageNum=str(n)) #獲取請求 rep=urllib.request.Request(url1,headers=header) #打開網頁 rep=urllib.request.urlopen(rep) #讀取網頁數據 try: html=rep.read().decode("utf-8") except: print("something wrong!") error=1 print("-------------now page ="+str(n)) if(error==1): continue
#正則匹配,你需要的資源都是在 像這樣的里面("thumbURL":"https://ss1.bdstatic.com/70cFvXSh_Q1YnxGkpoWK1HF6hhy/it/u=3734503404,179583637&fm=23&gp=0.jpg") p=re.compile("thumbURL.*?\.jpg")
#獲取正則匹配結果,返回的是一個list s=p.findall(html) #如果不路徑存在,創建路徑,最后的圖片保存在此路徑下 if os.path.isdir("f:\\myproject\\MyCrawlPic\\美女")!=True: os.makedirs(r"f:\\myproject\\MyCrawlPic\\美女") with open("testPic1.txt","w") as f: for i in s:
#獲取圖片的url i=i.replace("thumbURL\":\"","")
#在IDE上顯示,打印的結果 print(i)
#保存圖片的URL鏈接,當然你大可不必多此一舉 f.write(i) f.write("\n")
#進行寫入圖片 urllib.request.urlretrieve(i,"f:\\myproject\\MyCrawlPic\\美女\\pic{num}.jpg".format(num=j)) j+=1