python爬蟲之爬取百度圖片


#
#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                                                                                                                                                                              

  

                                                    







免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM