Python爬蟲簡單實(shí)現(xiàn)

所需要使用模塊

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)營者通過驗(yàn)證爬蟲的請求頭的 User-agent,accep-enconding 等信息來驗(yàn)證請求的發(fā)出宿主是不是真實(shí)的用戶常用瀏覽器或者一些特定的請求頭信息。
2、動態(tài)加載
通過 Ajax,或 者javascript 來動態(tài)獲取和加載數(shù)據(jù),加大爬蟲直接獲取數(shù)據(jù)的難度。
3、驗(yàn)證碼
這個相信大多數(shù)讀者非常熟悉了吧,當(dāng)我們輸錯多次密碼的時候,很多平臺都會彈出各種二維碼讓我們識別,或者搶火車票的時候,會出現(xiàn)各種復(fù)雜的驗(yàn)證碼,驗(yàn)證碼是反爬蟲措施中,運(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)行訪問,來隱藏自己的真實(shí)IP地址。
4、變換IP進(jìn)行爬取
可以通過動態(tài)的 IP 撥號服務(wù)器來變換 IP,也可以通過 Tor 代理服務(wù)器來變換 IP。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容