1. 程式人生 > >Python3爬蟲新手實踐及程式碼、經驗分享

Python3爬蟲新手實踐及程式碼、經驗分享

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)