国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

python入門實踐:如何爬取自如數據

peixn / 2813人閱讀

摘要:簡單來說就是瀏覽器向服務器表明身份用的。用戶行為主要靠。爬取數據我們的原材料準備好了,開始爬取,可以看見用的是去,池取得隨機配置組成請求。

首先代碼地址奉上
https://github.com/liangyuqi/...

一、簡介

use python to catch the information from ziru(彩蛋見最后

適合一起剛入門python的同學,我也是萌新,所以代碼可能不是很優雅

爬取思路分析見第五部分

二、環境 Python

python --version

(mac自帶)

brew install python

pip

pip --version

pip 是 Python 包管理工具,該工具提供了對Python 包的查找、下載、安裝、卸載的功能

curl https://bootstrap.pypa.io/get... -o get-pip.py

sudo python get-pip.py

三、安裝依賴

pip freeze >package.txt

sudo pip install -r package.txt

四、啟動

cd index

chmod a+x ziru_room.py

python ziru_room.py

五、思路分析 1.反反爬蟲

一般公司都有安全部門,防止大規模的撞庫或者帶寬擠占,那爬取的時候肯定會被攔截,定位然后律師函警告。

所以我覺得一個爬蟲系統最重要的就是反 反爬蟲。

我們先分析一下,一般簡單的反爬蟲什么思路?

用戶請求的Headers,用戶行為,網站目錄和數據加載方式

headers里面主要根據userAgent查重。userAgent 屬性是一個只讀的字符串,聲明了瀏覽器用于 HTTP 請求的用戶代理頭的值。簡單來說就是瀏覽器向服務器”表明身份“用的。

用戶行為主要靠ip。ip的話不用講了,和身份證號差不多,所以我們發起請求應該用動態的,同一ip多次訪問就可能被拉入ip黑名單,而且會導彈定位到你的服務器所在位置。

第三個方式比較高端了,我這次沒有展示。前兩種是爬蟲偽裝成瀏覽器讀取數據,但是第三種是模擬出一個瀏覽器進行用戶點擊提交等操作,它本身就是一個沒有界面的瀏覽器,從填寫表單到點擊按鈕再到滾動頁面,全部都可以模擬。這時候就可以根據一些其它方式,如識別點觸式(12306)或者滑動式的驗證碼。

整理好思路開始實現,我們的目標是實現一個動態的ip和userAgent池,每次請求偽裝成不一樣的來源

step1: 我們去爬取一個開放代理ip的網站。。。然后試試他開放的ip可不可用,可用的話加入我們的ip池。 詳見 代碼 ziru_room.py

    # 經測試可用ip
    usefulIp = []

    # 獲取代理ip地址
    uriGetIp = "http://www.xicidaili.com/wt/"

    # 檢測ip是否可用地址
    testGetIp = "http://icanhazip.com/"

    usefulIp = getUsefulIPList(uriGetIp, testGetIp, userAgent)
"""
獲取可用的ip列表
"""
def getUsefulIPList(uriGetIp, testGetIp, userAgent):
    # 全部代理ip
    allProxys = []

    # 經測試可用ip
    usefulIp = []
    ipList = requests.get(
        uriGetIp, headers={"User-Agent": random.choice(userAgent)})

    ipData = bs4.BeautifulSoup(ipList.text, "html.parser")

    ip = ipData.select("#ip_list > tr > td:nth-of-type(2)")

    port = ipData.select("#ip_list > tr > td:nth-of-type(3)")

    protocol = ipData.select("#ip_list > tr > td:nth-of-type(6)")

    for ip, port, protocol in zip(ip, port, protocol):
        proxy = ip.get_text().strip()+":"+port.get_text().strip()
        allProxys.append(proxy)

    print("正在初始化ip數據池,請耐心等待...")

    process.max_steps = len(allProxys)

    process.process_bar = process.ShowProcess(process.max_steps)

    # 篩選可用ip
    for proxy in allProxys:
        process.process_bar.show_process()
        # time.sleep(0.05)
        try:
            theIp = requests.get(testGetIp,  headers={"User-Agent": random.choice(userAgent)}, proxies={
                "http": proxy}, timeout=1, allow_redirects=False)
        except requests.exceptions.Timeout:
            # print("超過1s")
            continue
        except requests.exceptions.ConnectionError:
            # print("連接異常")
            continue
        except requests.exceptions.HTTPError:
            # print("http異常")
            continue
        except:
            # print("其他錯誤")
            continue
        else:
            if (theIp.status_code == 200 and len(theIp.text) < 20):
                usefulIp.append(proxy)
            #    print(theIp.text)

    print("可用ip池為下:"+",".join(usefulIp))
    return usefulIp

step2: 構造userAgent池

  userAgent = ["Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36",
                 "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0",
                 "Mozilla/5.0 (X11; U; Linux x86_64; zh-CN; rv:1.9.2.10) Gecko/20100922 Ubuntu/10.10 (maverick) Firefox/3.6.10"
                 ]

這個不像ip會經常掛,所以寫死問題不大。

2.爬取數據

我們的原材料準備好了,開始爬取,可以看見用的是random.choice()去ip,userAgent池取得隨機配置 組成 get請求。詳見 代碼 ziru_room.py

def computedData(usefulIp, userAgent, ipIndex=0):
    # debugger
    # pdb.set_trace()
    fhandle = open("../output/output.txt", "a")  # 追加寫入文件

    # Get請求-并傳遞headers
    try:
        data = requests.get("http://www.ziroom.com/z/nl/z3-r3-o2-s5%E5%8F%B7%E7%BA%BF-t%E5%8C%97%E8%8B%91%E8%B7%AF%E5%8C%97.html",
                            headers={"User-Agent": random.choice(userAgent)}, proxies={"http": random.choice(usefulIp)}, timeout=(3, 7))
        #
        pass
    except:
        print "Error: 請求失敗"
        computedData(usefulIp, userAgent)
        return
        pass
    else:
        roomDate = bs4.BeautifulSoup(data.text, "html.parser")
        # 標題
        title = roomDate.select("#houseList > li > div.txt > h3 > a")
        # 地點 改版沒了////
        # place = roomDate.select("#houseList > li > div.txt > h4 > a")
        # 距離
        distance = roomDate.select(
            "#houseList > li > div.txt > div > p:nth-of-type(2) > span")
        # 價格
        price = roomDate.select("#houseList > li > div.priceDetail > p.price")
        # 面積
        area = roomDate.select(
            "#houseList > li > div.txt > div > p:nth-of-type(1) > span:nth-of-type(1)")
        # 樓層
        floor = roomDate.select(
            "#houseList > li > div.txt > div > p:nth-of-type(1) > span:nth-of-type(2)")
        # 房間配置
        room = roomDate.select(
            "#houseList > li > div.txt > div > p:nth-of-type(1) > span:nth-of-type(3)")
        #
        print("北京市自如數據如下")
        fhandle.write("北京市"+time.strftime("%Y-%m-%d %H:%M:%S",
                                          time.localtime()) + "自如數據如下"+"
")

        for title, price, area, floor, room, distance in zip(title, price, area, floor, room, distance):
            last_data = {
                "名稱": title.get_text().strip(),
                # "地段": place.get_text().strip(),
                "距離": distance.get_text().strip(),
                "價格": price.get_text().replace(" ", "").replace("
", ""),
                "面積": area.get_text().strip(),
                "樓層": floor.get_text().strip(),
                "房間大小": room.get_text().strip()
            }

            fhandle.write("名稱:"+title.get_text().strip())
            # fhandle.write("地段:"+place.get_text().strip())
            fhandle.write("距離:"+distance.get_text().strip())
            fhandle.write(
                "價格:"+price.get_text().replace(" ", "").replace("
", ""))
            fhandle.write("面積:"+area.get_text().strip())
            fhandle.write("樓層:"+floor.get_text().strip())
            fhandle.write("房間大?。?+room.get_text().strip() + "
")

            # print  json.dumps(last_data).decode("unicode-escape")
            # print  json.dumps(last_data,ensure_ascii=False)
            print json.dumps(last_data, encoding="UTF-8", ensure_ascii=False)

        fhandle.write("************************************************"+"
")
        fhandle.close()
        print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
        pass
3.其他部分

因為爬取可用的ip組成ip池,是一個比較耗時的過程,所以加入了圖像化的等待顯示,詳見 代碼 process.py

自動化爬取要有點節操,所以得加入延時,詳見 代碼 ziru_room.py

    while(True):
        computedData(usefulIp, userAgent)
        time.sleep(60)

python 一點其他感觸,寫起來很簡潔,這個換行縮進還有dict對象中文Unicode搞了很久。。。目前和node相比優缺點在哪里還沒有分析好,可以留言探討下。

碼字辛苦,代碼粗糙后續會有優化,點小手star一下謝謝
https://github.com/liangyuqi/...

最后送上彩蛋,這位老哥最后根據github 里qq 找到的我,反反爬蟲不算太失敗吧,爬取的也不是什么關鍵數據,手動滑稽,僅供萌新學習練手

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/43116.html

相關文章

  • 蟲 - 收藏集 - 掘金

    摘要:在這之前,還是有必要對一些概念超輕量級反爬蟲方案后端掘金前言爬蟲和反爬蟲日益成為每家公司的標配系統。 爬蟲修煉之道——從網頁中提取結構化數據并保存(以爬取糗百文本板塊所有糗事為例) - 后端 - 掘金歡迎大家關注我的專題:爬蟲修煉之道 上篇 爬蟲修煉之道——編寫一個爬取多頁面的網絡爬蟲主要講解了如何使用python編寫一個可以下載多頁面的爬蟲,如何將相對URL轉為絕對URL,如何限速,...

    1fe1se 評論0 收藏0
  • 首次公開,整理12年積累的博客收藏夾,零距離展示《收藏夾吃灰》系列博客

    摘要:時間永遠都過得那么快,一晃從年注冊,到現在已經過去了年那些被我藏在收藏夾吃灰的文章,已經太多了,是時候把他們整理一下了。那是因為收藏夾太亂,橡皮擦給設置私密了,不收拾不好看呀。 ...

    Harriet666 評論0 收藏0
  • SegmentFault 技術周刊 Vol.30 - 學習 Python 來做一些神奇好玩的事情吧

    摘要:學習筆記七數學形態學關注的是圖像中的形狀,它提供了一些方法用于檢測形狀和改變形狀。學習筆記十一尺度不變特征變換,簡稱是圖像局部特征提取的現代方法基于區域圖像塊的分析。本文的目的是簡明扼要地說明的編碼機制,并給出一些建議。 showImg(https://segmentfault.com/img/bVRJbz?w=900&h=385); 前言 開始之前,我們先來看這樣一個提問: pyth...

    lifesimple 評論0 收藏0
  • 大話蟲的實踐技巧

    摘要:圖意淫爬蟲與反爬蟲間的對決數據的重要性如今已然是大數據時代,數據正在驅動著業務開發,驅動著運營手段,有了數據的支撐可以對用戶進行用戶畫像,個性化定制,數據可以指明方案設計和決策優化方向,所以互聯網產品的開發都是離不開對數據的收集和分析,數 showImg(https://segmentfault.com/img/remote/1460000013428119?w=539&h=337)...

    沈儉 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<