Python3爬蟲新手實踐及程式碼、經驗分享
阿新 • • 發佈:2019-01-13
Python3靜態網頁爬蟲新手實踐及程式碼、經驗分享
寫在最前
在寫爬蟲之前需要先配置python環境,爬取靜態網頁的文字及圖片只需要通過pip安裝Scrapy、beautifulsoup4 。(此處略去一萬字,可以自行百度python3爬蟲框架)
一定要注意python程式碼的格式化!
開始實踐
一般網站都會有反爬蟲機制,所以我們在這裡使用最簡單的方法構建header頭。
header={'User-Agent':'Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:10.0) Gecko/20100101 Firefox/10.0'}
還可以用代理IP防止網站因訪問速度太快封IP。對於代理IP我們可以直接百度”代理IP“進行查詢。
url1 = request.Request(url,headers=header)
#建立代理IP列表,此處去百度查代理IP。此處IP只是示例!!!!
iplist = ['61.135.217.7:80','115.223.223.132:9000']
proxies = {'http':random.choice(iplist)}
proxy_support = urllib.request.ProxyHandler(proxies)
#建立opener
opener = urllib.request.build_opener(proxy_support)
#安裝opener,此後呼叫urlopen()時都會使用安裝過的opener物件
urllib.request.install_opener(opener)
之後要用到BeautifulSoup。對於BeautifulSoup可以用Python標準庫,這種方法速度快簡單但是容錯差。此處就是利用標準庫
soup = BeautifulSoup(html,'html.parser')
對於爬蟲的一個關鍵就是通過正則表示式獲取到所需的內容。此處的程式碼作用是爬取圖片,!!!!對於不同網站正則表示式會有差異!!!!在此處是認為圖片的標籤是img。之後用正則表示式獲取到圖片的源地址並存入列表,便於一個一個爬取儲存下載。如有不懂正則表示式的可以在菜鳥教程中學習或留言交流交流。
links = soup.find_all('img',src=re.compile(r'.jpg$'))
之後就是簡單的遍歷下載了。此處有一個坑就是需要再開啟圖片的源地址,對於這個頁面我們的header頭又變成了python的初始header,這個時候伺服器認出這是爬蟲,如果此網站恰巧不想被爬就會關閉連線,此時程式就會丟擲403異常。此時我們將每個需要訪問的網址加上header就會正常了
for link in links:
print(link.attrs['src'])
url_real='https:'+link.attrs["src"]
print(url_real)
header={'User-Agent':'Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:10.0) Gecko/20100101 Firefox/10.0'}
url_real = request.Request(url_real,headers=header)
data = urllib.request.urlopen(url_real).read()
with open(path+'\%s.jpg' % time.time(), 'wb') as f:
f.write(data)
pass
到此為止,你的爬蟲就能使用了。
說了這麼多是時候上程式碼了:
from bs4 import BeautifulSoup
import urllib.request
from urllib import request
import re
import time
import random
import requests
print('輸入網址:',end="")
url = input('')
header={'User-Agent':'Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:10.0) Gecko/20100101 Firefox/10.0'}
#丟擲異常
try:
url1 = request.Request(url,headers=header)
iplist = ['XXX.XXX.XXX.XXX:XXXX','XXX.XXX.XXX.XXX:XXXX','115.223.223.132:9000\
']
proxies = {'http':random.choice(iplist)}
proxy_support = urllib.request.ProxyHandler(proxies)
opener = urllib.request.build_opener(proxy_support)
urllib.request.install_opener(opener)
html = urllib.request.urlopen(url1).read()#.decode('utf-8') 若顯示亂碼則將加上編碼
soup = BeautifulSoup(html,'html.parser')
links = soup.find_all('img',src=re.compile(r'.jpg$'))
path = r'F:\程式語言Learning\Python\test\images'
for link in links:
print(link.attrs['src'])
url_real='https:'+link.attrs["src"]
print(url_real)
header={'User-Agent':'Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:10.0) Gecko/20100101 Firefox/10.0'}
url_real = request.Request(url_real,headers=header)
data = urllib.request.urlopen(url_real).read()
with open(path+'\%s.jpg' % time.time(), 'wb') as f:
f.write(data)
pass
except urllib.error.URLError as e:
print(e.reason)