所需要使用模塊
requests官網(wǎng)API:https://requests.readthedocs.io/zh_CN/latest/
bs4API:https://www.crummy.com/software/BeautifulSoup/bs4/doc/index.zh.html
簡單的例子
# 倒入模塊
import requests
from bs4 import BeautifulSoup
import json
import time
# 簡單爬蟲
class Reptile:
# url
url = "https://docs.python.org/zh-cn/3.9/library/csv.html"
# header
headers = {
# 請求代理谜叹,模擬瀏覽器請求
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 11_2_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36"
}
# 獲取網(wǎng)頁內(nèi)容
def get_url_data(self, file_name):
# 發(fā)起請求
r = requests.get(self.url, headers=self.headers)
# 制定網(wǎng)頁文本格式
b = BeautifulSoup(r.text, "html.parser")
# 獲取指定標(biāo)簽竭宰、class的內(nèi)容
mooc_classes = b.find_all("a", "reference")
class_list = []
# 格式化課程信息
for i in range(len(mooc_classes)):
title = mooc_classes[i].text.strip()
class_list.append("鏈接名稱: {} \n".format(title))
# 將課程信息寫入文本文件中
with open(file_name, "a+") as f:
for text in class_list:
f.write(text)
# 抓取圖片
def get_images(self):
try:
# 開始抓取時間
print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
# 抓取站酷圖片URL螟凭,循環(huán)抓取100次惕耕,每次抓取20
url = "https://www.zcool.com.cn/discover.json"
i = 1
n = 1
while i < 100:
params = {
'cate': 33,
'subCate': 0,
'hasVideo': 0,
'city': 0,
'college': 0,
'recommendLevel': 2,
'sort': i,
'sa': '1616382241000,p_12879945',
'pageNo': 1,
'gogoupApiFlag': True,
'isFetchGogoUp': False,
'limit': 20
}
i = i + 1
# 發(fā)起請求
r = requests.get(url, headers=self.headers, params=params)
# JSON解碼
data = json.loads(r.text)
for item in data["data"]["data"]:
if item["object"]["cover"] != "":
print(item["object"]["cover"], item["object"]["title"], n)
n = n + 1
res = requests.get(item["object"]["cover"], headers=self.headers)
title = item["object"]["title"].replace("/", "_")
with open("./images/%s.jpg" % title, 'wb') as f:
f.write(res.content)
# 結(jié)束抓取時間
print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
except Exception as e:
print("抓取失敗劫拗。继效。早像。桨踪。")
print(e.args)
print(str(e))
print(repr(e))
else:
print("完成")
反爬蟲
1、請求頭識別
這是一種最基本的反爬蟲方式掀亩,網(wǎng)站運(yùn)營者通過驗證爬蟲的請求頭的 User-agent,accep-enconding 等信息來驗證請求的發(fā)出宿主是不是真實的用戶常用瀏覽器或者一些特定的請求頭信息舔哪。
2、動態(tài)加載
通過 Ajax槽棍,或 者javascript 來動態(tài)獲取和加載數(shù)據(jù)捉蚤,加大爬蟲直接獲取數(shù)據(jù)的難度。
3炼七、驗證碼
這個相信大多數(shù)讀者非常熟悉了吧缆巧,當(dāng)我們輸錯多次密碼的時候,很多平臺都會彈出各種二維碼讓我們識別豌拙,或者搶火車票的時候陕悬,會出現(xiàn)各種復(fù)雜的驗證碼,驗證碼是反爬蟲措施中按傅,運(yùn)用最廣捉超,同時也是最有效直接的方式來阻止爬蟲的措施之一。
4唯绍、限制IP
在識別到某些異常的訪問的時候拼岳,網(wǎng)站運(yùn)營者會設(shè)置一個黑名單,把一些判定為爬蟲的IP進(jìn)行限制或者封殺况芒。
5惜纸、賬號限制
有些網(wǎng)站,沒有游客模式绝骚,只有通過注冊后才可以登錄看到內(nèi)容堪簿,這個就是典型的使用賬號限制網(wǎng)站,一般可以用在網(wǎng)站用戶量不多皮壁,數(shù)據(jù)安全要求嚴(yán)格的網(wǎng)站中。
反反爬蟲
1哪审、更改 UserAgent
我們可以在請求頭中替換我們的請求媒介蛾魄,讓網(wǎng)站誤認(rèn)為是我們是通過移動端的訪問,運(yùn)行下面的代碼后湿滓,當(dāng)我們打開 hupu.html,我們會發(fā)現(xiàn)返回的是移動端的虎撲的頁面而不是網(wǎng)頁端的滴须。
2、減少爬取頻率叽奥,設(shè)置間隔時間
比如扔水,我們可以設(shè)置一個隨機(jī)的間隔時間,來模擬用戶的行為朝氓,減少訪問的次數(shù)和頻率魔市。
我們可以在我們爬蟲的程序中主届,加入如下的代碼,讓爬蟲休息3秒左右待德,再進(jìn)行爬取君丁,可以有效地避開網(wǎng)站的對爬蟲的檢測和識別。
3将宪、運(yùn)用代理機(jī)制
代理就是通過訪問第三方的機(jī)器绘闷,然后通過第三方機(jī)器的 IP 進(jìn)行訪問,來隱藏自己的真實IP地址较坛。
4印蔗、變換IP進(jìn)行爬取
可以通過動態(tài)的 IP 撥號服務(wù)器來變換 IP,也可以通過 Tor 代理服務(wù)器來變換 IP丑勤。