1. 程式人生 > >pycharm 爬取校花網

pycharm 爬取校花網

  1 1:什麼是爬蟲
  2     定義:狹義:模擬瀏覽器,瀏覽網頁,儲存資料的程式
  3     定義:廣義:自動下載網路資料(網頁,遊戲,qq)的程式
  4     開啟校花網 ‘www.xiaohuar.com/hua/’    #直接爬取影響課堂秩序
  5         如果 你不會寫爬蟲,你老闆讓你下載校花網的一千張圖片,用了一整天,你只能另存為。那麼,可能你一天過後就被T了
  6     
  7     分析:
  8             web原理:
  9                 c/s   client,server
 10                 瀏覽器
11 伺服器(server) 12 瀏覽器要獲取一個網頁,首先他要獲取一個網址(url:統一資源定位符)。 13 瀏覽器獲取到url之後,會向伺服器傳送一個http(網路傳輸協議的一種)請求 14 伺服器會對這個請求進行處理,將處理結果返回(請求【文件,圖片,視屏】,就返回相應的【文件,圖片,視屏】) #http響應 15 瀏覽器根據返回的資料,進行不同的渲染,展示給使用者 16 基於socket
17 2:寫一個爬蟲的步驟: 18 1.下載資料 #先下載一張 19 1.frist_url = 'http://www.xiaohuar.com/hua/' 20 分析網頁的載入流程 21 分類 22 直接的,未處理的 23 帶引數驗證 24 cookie驗證 25 登入驗證 26 js加密 27 工具: 28 google,火狐
29 f12 30 看原始碼 31 選取儲存地址,滑鼠右鍵 open in new tab,複製網址連結‘http://www.xiaohuar.com/d/file/20181216/9df718a54adae448c65f54246a581a19.jpg’ 32 先測試一下 33 pycharm: 34 from urllib impor request #通過這個就可以傳送請求了 35 url = ‘http://www.xiaohuar.com/d/file/20181216/9df718a54adae448c65f54246a581a19.jpg’ 36 #request.urlopen(url) 37 response = request.urlopen(url) #用一個變數來接收 38 print(respomse) #顯示了一個http respomse 的物件,不是我們想要的 39 print(respomse.read()) #以‘b’開頭的叫位元組,就是二進位制資料 40 41 42 #儲存圖片:把圖片的的資訊放進檔案裡(把大象放進冰箱需要幾步) 43 f = open('1.jpg','wb') #指明以二進位制的模式開啟,只能寫入二進位制數 44 f.write(respomse.read()) 45 f.close() 46 #如果報錯,因為read讀取過後,把下標移到了末尾,把上面print(respomse.read())註釋掉 47 簡化一下: #不需要我們去close了 48 with open(filename,'wb') as f: 49 f.write(request.urlopen(url).read()) 50 51 52 2.分析提取有用的資料 53 獲取其他圖片url 54 開始獲取所有圖片: 55 url = 'http://www.xiaohuar.com/hua/' #url = 首頁 56 response = request.urlopen(url) #用一個變數來接收 57 #print(respomse) #顯示了一個http respomse 的物件,不是我們想要的 58 #print(response.read()) #以‘b’開頭的叫位元組,就是二進位制資料(位元組) 59 #print(response.read().decode('GBK')) #轉碼,變成文字,加上一個字元編碼#成功的獲得了文件形式的網頁原始碼 60 改寫成一句: 61 html = 'request.urlopen(url).read().decode('GBK')' #現在,html就是我們的頁面資訊 62 63 需要拿到地址的字串: 64 網頁原始碼,查詢img 65 使用正則,通過一定的規律,在文件裡面來匹配符合規則的字元,獲取出來 66 import url 67 複製幾個地址過來,用來匹配 68 #/d/file/20181216/9df718a54adae448c65f54246a581a19.jpg 69 #/d/file/20180907/075025972927c8e7541b09e272afe5cc.jpg 70 img_urls = re.findall(r'/d/file/\d+/\w+\.jpg',html) #找規律 \d匹配數字 \w可以匹配字母和數字的組合,+代表多個 71 #print(len(img_urls,img_urls[0])) #列印操作,列印匹配出多少個,匹配出來的第一個的值 72 》》》/d/file/20181216/9df718a54adae448c65f54246a581a19.jpg #這個url有什麼問題?沒有域名 73 img_urls = ('http://www.xiaohuar.com %s' % url for url in img_urls) #補全操作,給他新增域名 #python先計算右邊,再賦值給左邊 74 #現在,會報錯,因為用了for 迴圈,他是一個生成器,不能使用len方法,想要檢視,使用for迴圈img_urls,列印url 75 #現在下載圖片 76 #用url的最後一節做名字 77 for url in img_urls: 78 filename = url.split('/')[-1] #以‘/’切片,分割之後獲得一個列表,獲取最後一個【-1】 79 #print(filename) 80 with open(filename,'wb') as f: 81 f.write(request.urlopen(url).read()) 82 print(url) #好看 83 #多頁操作 84 點選第二頁,複製url(http://www.xiaohuar.com/list-1-1.html) 85 點選三頁,複製url(http://www.xiaohuar.com/list-1-2.html) 86 以此類推 87 新增到文章開頭url = 'http://www.xiaohuar.com/hua/'下面 88 寫最簡單的方法: 89 urls = ['http://www.xiaohuar.com/hua/', #依次改一下 90 http://www.xiaohuar.com/list-1-1.html 91 http://www.xiaohuar.com/list-1-2.html 92 http://www.xiaohuar.com/list-1-3.html 93 http://www.xiaohuar.com/list-1-4.html 94 http://www.xiaohuar.com/list-1-5.html 95 ] 96 for url in urls: 97 '把剛才的程式碼縮排進去' 98 99 很容易報錯,因為沒有做任何的處理,urlopen(url)如果時間超時了,或者404沒有找到,就會報錯 100 101 程式碼不規範,全部都是面向過程寫的,也沒有異常處理 102 103 104 3.儲存資料 105 106
理論知識

 

 1 from urllib import request
 2 import re
 3 url = 'http://www.xiaohuar.com/hua/'
 4 html = request.urlopen(url).read().decode('GBK')
 5 img_url =re.findall(r'/d/file/\d+/\w+\.jpg',html)
 6 for url in img_url:
 7     img_urls = 'http://www.xiaohuar.com%s ' %url
 8     filename = img_urls.split('/')[-1]
 9     with open(filename,'wb') as f :
10         f.write(request.urlopen(img_urls).read())
11         print()
單頁操作