簡單爬蟲總結
URL:
URL主要有三部分組成:
(1)協議,常見的協議有http,https,ftp,file(訪問本地資料夾),ed2k(電驢的專用連結)等等。
(2)存放資源的伺服器的域名系統(DNS)主機名或者IP地址(有時候包含埠號,各種傳輸協議都有預設的埠號)
(3)主機資源的具體地址,如目錄和檔名等
注意:
第一部分和第二部分用"://"符號隔開的,
第二部分和第三部分用"/"符號隔開的,
第一部分和第二部分是不可缺少的,第三部分有時候可以省略。
urllib:
爬取網頁:
import urllib.request
response = urllib.request.urlopen("http://www.baidu.com")
html = response.read().decode("utf-8")
print(html)
下載一隻小貓:
import urllib.request # req = urllib.request.Request("url") # response = urllib.request.urlopen(req) response = urllib.request.urlopen("url") html = response.read().decode("utf-8") with open("name.jpg",'wb') as f: f.write(html)
注意:
(1)urlopen的url引數即可以是一個字串也可以是一個Request物件,如果你傳入是一個字串,那麼Python是會預設幫你
把目標字元轉換成Request物件,然後在傳入urlopen函式,如上述註釋程式碼所示。
(2)urlopen實際上返回的是一個類檔案物件,因此你可以用read()方法來讀取內容,他還有以下三個函式會用到。
1.geturl()--返回請求的url
2.info()--返回一個httplib,HTTPMessage物件,包含遠端伺服器返回的頭資訊。
3.getcode()--返回HTTP狀態碼
隱藏身份:
UserAgent:
對於一些伺服器來說是不願意讓爬蟲進行爬去的,這樣伺服器的壓力就會增加,伺服器一般是通過User-Agent來識別 的,普通瀏覽器會通過該內容向訪問網站提供你所使用的瀏覽器型別、作業系統、瀏覽器核心等資訊的標識。
修改User-Agent:
例項化Request物件的時候將headers引數傳進去或者通過add_header()方法往Request物件新增headers,如:
import urllib.request
import urllib.parse
head={}
head["Referer"] = ""
head["User-Agent"] = ""
data = {}
data["type"] = ""
data["keyform"] = ""
data = urllib.parse.urlencode(data).encode("utf-8")
req = urllib.request.Request(url,data,head)
# req = urllib.request.Request(url,data)
# req.add_header('Referer','')
# req.add_header('User-Agent','')
urllib.request.urlopen(req)
注意:如果長時間靠修改User-Agent進行抓取,那麼一個IP短時間內連續進行網頁的訪問,很可能會被服務
器識別是機器抓取,所以,這裡有兩種策略可供選擇:
第一種就是延遲提交的時間,但是這樣會使得工作效率低下。
第二種策略就是使用代理。
使用代理:
使用代理IP,伺服器看到的是代理IP地址,而不是你自己的IP地址。
proxy_support = urllib.request.ProxyHandler({'http':'211.138.2.4:80'})
引數是一個字典,字典的鍵是代理的型別,字典的值就是代理的IP地址和對應的埠號。
opener = urllib.request.build_opener(proxy_support)
opener可以看作是一個私人訂製,當使用urlopen()函式開啟一個網頁的時候,你就是使用預設的opener在工作
所以這裡使用build_opener()函式建立了一個屬於我們自己私人定製的opener
urllib.request.install_opener(opener)
這裡將制定好的opener安裝到系統中,這是一勞永逸的做法
因為在此之後,你只需要使用普通的urlopen()函式,就是以定製好的opener進行工作的。
如果你不想替換掉預設的opener,你也可以每次特殊需要的時候,用opener.open()的方法來開啟網頁。
iplist = input("請輸入IP:").split(sep=";")
ip = random.choice(iplist) #隨機使用IP
iplist = input("請輸入IP:").split(sep=";")
ip = random.choice(iplist) #隨機使用IP
Beautiful Soup:
安裝Beautiful Soup:
開啟cmd,執行命令: python3 -m pip install BeautifulSoup4
在IDE下from bs4 import BeautifulSoup,沒有報錯說明安裝成功
使用Beautiful Soup:
from bs4 import BeautifulSoup
html = response.read().decode('utf-8')
soup = BeautifulSoup(html,'html.parser')
for each in soup.find_all(""):
print(each)
正則表示式:
網上查資料