溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Python爬蟲入門【3】:美空網(wǎng)數(shù)據(jù)爬取

發(fā)布時(shí)間:2020-06-16 16:28:03 來(lái)源:網(wǎng)絡(luò) 閱讀:925 作者:學(xué)Python派森 欄目:編程語(yǔ)言

美空網(wǎng)數(shù)據(jù)----簡(jiǎn)介

從今天開始,我們嘗試用2篇博客的內(nèi)容量,搞定一個(gè)網(wǎng)站叫做“美空網(wǎng)”網(wǎng)址為:http://www.moko.cc/, 這個(gè)網(wǎng)站我分析了一下,我們要爬取的圖片在 下面這個(gè)網(wǎng)址

http://www.moko.cc/post/1302075.html

然后在去分析一下,我需要找到一個(gè)圖片列表頁(yè)面是最好的,作為一個(gè)勤勞的爬蟲coder,我找到了這個(gè)頁(yè)面

http://www.moko.cc/post/da39db43246047c79dcaef44c201492d/list.html

列表頁(yè)面被我找到了,貌似沒(méi)有分頁(yè),這就簡(jiǎn)單多了,但是剛想要爬,就翻車了,我發(fā)現(xiàn)一個(gè)嚴(yán)重的問(wèn)題。

http://www.moko.cc/post/==da39db43246047c79dcaef44c201492d==/list.html

我要做的是一個(gè)自動(dòng)化的爬蟲,但是我發(fā)現(xiàn),出問(wèn)題了,上面那個(gè)×××背景的位置是啥?

ID,昵稱,個(gè)性首頁(yè),這個(gè)必須要搞定。

我接下來(lái)隨機(jī)的找了一些圖片列表頁(yè),試圖找到規(guī)律到底是啥?

  1. http://www.moko.cc/post/978c74a0375f4edca114e87b0a45a0b5/list.html

  2. http://www.moko.cc/post/jundayi/list.html

  3. http://www.moko.cc/post/slavik/list.html

  4. ......

沒(méi)什么問(wèn)題,發(fā)現(xiàn)規(guī)律了

http://www.moko.cc/post/==個(gè)性昵稱(中文昵稱是一個(gè)加密的串)==/list.html

這就有點(diǎn)意思了,我要是能找到盡量多的昵稱,不就能拼接出來(lái)我想要得所有地址了嗎

開干?。?!

手段,全站亂點(diǎn),找入口,找切入點(diǎn),找是否有API

.... .... 結(jié)果沒(méi)找著

下面的一些備選方案

趴這個(gè)頁(yè)面,發(fā)現(xiàn)只有 20頁(yè) http://www.moko.cc/channels/post/23/1.html

每頁(yè)48個(gè)模特,20頁(yè)。那么也才960人啊,完全覆蓋不到盡可能多的用戶。

接著又找到

http://www.moko.cc/catalog/index.html 這個(gè)頁(yè)面

確認(rèn)了一下眼神,以為發(fā)現(xiàn)問(wèn)題了,結(jié)果

Python爬蟲入門【3】:美空網(wǎng)數(shù)據(jù)爬取

哎呀,還么有權(quán)限,誰(shuí)有權(quán)限,可以跟我交流一下,一時(shí)激動(dòng),差點(diǎn)去下載他們的APP,然后進(jìn)行抓包去。

上面兩條路,都不好弄,接下來(lái)繼續(xù)找路子。

無(wú)意中,我看到了一絲曙光

Python爬蟲入門【3】:美空網(wǎng)數(shù)據(jù)爬取

關(guān)注名單,點(diǎn)進(jìn)去

Python爬蟲入門【3】:美空網(wǎng)數(shù)據(jù)爬取

哈哈哈,OK了,這不就是,我要找到的東西嗎?

不多說(shuō)了,爬蟲走起,測(cè)試一下他是否有反扒機(jī)制。

我找到了一個(gè)關(guān)注的人比較多的頁(yè)面,1500多個(gè)人

http://www.moko.cc/subscribe/chenhaoalex/1.html

然后又是一波分析操作

美空網(wǎng)數(shù)據(jù)----爬蟲數(shù)據(jù)存儲(chǔ)

確定了爬蟲的目標(biāo),接下來(lái),我做了兩件事情,看一下,是否對(duì)你也有幫助

  1. 確定數(shù)據(jù)存儲(chǔ)在哪里?最后我選擇了MongoDB
  2. 用正則表達(dá)式去分析網(wǎng)頁(yè)數(shù)據(jù)

對(duì)此,我們需要安裝一下MongoDB,安裝的辦法肯定是官網(wǎng)教程啦!

https://docs.mongodb.com/master/tutorial/install-mongodb-on-red-hat/

如果官方文檔沒(méi)有幫助你安裝成功。

那么我推薦下面這篇博客

https://www.cnblogs.com/hackyo/p/7967170.html

安裝MongoDB出現(xiàn)如下結(jié)果

Python爬蟲入門【3】:美空網(wǎng)數(shù)據(jù)爬取

接下來(lái),你要學(xué)習(xí)的是 關(guān)于mongodb用戶權(quán)限的管理

http://www.cnblogs.com/shiyiwen/p/5552750.html

mongodb索引的創(chuàng)建

https://blog.csdn.net/salmonellavaccine/article/details/53907535

別問(wèn)為啥我不重新寫一遍,懶唄~~~ 況且這些資料太多了,互聯(lián)網(wǎng)大把大把的。

一些我經(jīng)常用的mongdb的命令


鏈接 mongo --port <端口號(hào)>

選擇數(shù)據(jù)庫(kù) use admin 

展示當(dāng)前數(shù)據(jù)庫(kù)  db 

當(dāng)前數(shù)據(jù)庫(kù)授權(quán)  db.auth("用戶名","密碼")

查看數(shù)據(jù)庫(kù)  show dbs

查看數(shù)據(jù)庫(kù)中的列名  show collections 

創(chuàng)建列  db.createCollection("列名")

創(chuàng)建索引 db.col.ensureIndex({"列名字":1},{"unique":true})

展示所有索引 db.col.getIndexes()

刪除索引 db.col.dropIndex("索引名字")  

查找數(shù)據(jù)  db.列名.find()

查詢數(shù)據(jù)總條數(shù)  db.列名.find().count() 
Python資源分享qun 784758214 ,內(nèi)有安裝包,PDF,學(xué)習(xí)視頻,這里是Python學(xué)習(xí)者的聚集地,零基礎(chǔ),進(jìn)階,都?xì)g迎

上面基本是我最常用的了,我們下面實(shí)際操作一把。

美空網(wǎng)數(shù)據(jù)----用Python鏈接MongoDB

使用 pip3 安裝pymongo庫(kù)

使用pymongo模塊連接mongoDB數(shù)據(jù)庫(kù)

一些準(zhǔn)備工作

  1. 創(chuàng)建dm數(shù)據(jù)庫(kù)

    鏈接上mongodb 在終端使用命令 mongo --port 21111

[linuxboy@localhost ~]$ mongo --port 21111
MongoDB shell version v3.6.5
connecting to: mongodb://127.0.0.1:21111/
MongoDB server version: 3.6.5
> 
  1. 配置用戶權(quán)限:接著上面輸入命令 show dbs 查看權(quán)限

Python爬蟲入門【3】:美空網(wǎng)數(shù)據(jù)爬取

權(quán)限不足

  1. 創(chuàng)建管理用戶
db.createUser({user: "userAdmin",pwd: "123456", roles: [ { role: "userAdminAnyDatabase", db: "admin" } ] } )
  1. 授權(quán)用戶
db.auth("userAdmin","123456")
  1. 查看權(quán)限
> db.auth("userAdmin","123456")
1
> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB
moko    0.013GB
test    0.000GB
> 
Python資源分享qun 784758214 ,內(nèi)有安裝包,PDF,學(xué)習(xí)視頻,這里是Python學(xué)習(xí)者的聚集地,零基礎(chǔ),進(jìn)階,都?xì)g迎
  1. 接下來(lái)創(chuàng)建 dm數(shù)據(jù)庫(kù)<在這之前還需要?jiǎng)?chuàng)建一個(gè)讀寫用戶>
> use dm
switched to db dm
> db
dm
> db.createUser({user: "dba",pwd: "dba", roles: [ { role: "readWrite", db: "dm" } ] } )
Successfully added user: {
    "user" : "dba",
    "roles" : [
        {
            "role" : "readWrite",
            "db" : "dm"
        }
    ]
}
> 
  1. 重新授權(quán)
db.auth("dba","dba")
  1. 創(chuàng)建一列數(shù)據(jù)
> db.createCollection("demo")
{ "ok" : 1 }
> db.collections
dm.collections
> show collections
demo
> 
  1. Python實(shí)現(xiàn)插入操作
import pymongo as pm  #確保你已經(jīng)安裝過(guò)pymongo了

 # 獲取連接
client = pm.MongoClient('localhost', 21111)  # 端口號(hào)是數(shù)值型

# 連接目標(biāo)數(shù)據(jù)庫(kù)
db = client.dm

# 數(shù)據(jù)庫(kù)用戶驗(yàn)證
db.authenticate("dba", "dba")
post = {
        "id": "111111",
        "level": "MVP",
        "real":1,
        "profile": '111',
        'thumb':'2222',
        'nikename':'222',
        'follows':20
}

db.col.insert_one(post) # 插入單個(gè)文檔

# 打印集合第1條記錄
print (db.col.find_one())
  1. 編譯執(zhí)行
[linuxboy@bogon moocspider]$ python3 mongo.py
{'_id': ObjectId('5b15033cc3666e1e28ae5582'), 'id': '111111', 'level': 'MVP', 'real': 1, 'profile': '111', 'thumb': '2222', 'nikename': '222', 'follows': 20}
[linuxboy@bogon moocspider]$ 

好了,我們到現(xiàn)在為止,實(shí)現(xiàn)了mongodb的插入問(wèn)題。

美空網(wǎng)數(shù)據(jù)----用Python 爬取關(guān)注對(duì)象

首先,我需要?jiǎng)?chuàng)造一個(gè)不斷抓取鏈接的類

這個(gè)類做的事情,就是分析

http://www.moko.cc/subscribe/chenhaoalex/1.html

這個(gè)頁(yè)面,總共有多少頁(yè),然后生成鏈接

Python爬蟲入門【3】:美空網(wǎng)數(shù)據(jù)爬取

抓取頁(yè)面中的總頁(yè)數(shù)為77

Python爬蟲入門【3】:美空網(wǎng)數(shù)據(jù)爬取

正則表達(dá)式如下

onfocus=\"this\.blur\(\)\">(\d*?)<

在這里,由所有的分頁(yè)都一樣,所以,我匹配了全部的頁(yè)碼,然后計(jì)算了數(shù)組中的最大值

#獲取頁(yè)碼數(shù)組
pages = re.findall(r'onfocus=\"this\.blur\(\)\">(\d*?)<',content,re.S)   #獲取總頁(yè)數(shù)
page_size = 1
if pages:  #如果數(shù)組不為空
    page_size = int(max(pages))   #獲取最大頁(yè)數(shù)

接下來(lái)就是我們要搞定的生產(chǎn)者編碼階段了,我們需要打造一個(gè)不斷獲取連接的爬蟲

簡(jiǎn)單的說(shuō)就是

我們需要一個(gè)爬蟲,不斷的去爬取

http://www.moko.cc/subscribe/chenhaoalex/1.html 這個(gè)頁(yè)面中所有的用戶,并且還要爬取到總頁(yè)數(shù)。

比如查看上述頁(yè)面中,我們要獲取的關(guān)鍵點(diǎn)如下

Python爬蟲入門【3】:美空網(wǎng)數(shù)據(jù)爬取

通過(guò)這個(gè)頁(yè)面,我們要得到,這樣子的一個(gè)數(shù)組,注意下面數(shù)組中有個(gè)位置【我用爬蟲爬到的】這個(gè)就是關(guān)鍵的地方了

all_urls = [
    "http://www.moko.cc/subscribe/chenhaoalex/1.html",
    "http://www.moko.cc/subscribe/chenhaoalex/2.html",
    "http://www.moko.cc/subscribe/chenhaoalex/3.html",
    "http://www.moko.cc/subscribe/chenhaoalex/4.html",
    ......
    "http://www.moko.cc/subscribe/dde760d5dd6a4413aacb91d1b1d76721/1.html"
    "http://www.moko.cc/subscribe/3cc82db2231a4449aaa97ed8016b917a/1.html"
    "http://www.moko.cc/subscribe/d45c1e3069c24152abdc41c1fb342b8f/1.html"
    "http://www.moko.cc/subscribe/【我用爬蟲爬到的】/1.html"

    ]

引入必備模塊

# -*- coding: UTF-8 -*-
import requests   #網(wǎng)絡(luò)請(qǐng)求模塊
import random     #隨機(jī)模塊
import re         #正則表達(dá)式模塊
import time       #時(shí)間模塊
import threading  #線程模塊
import pymongo as pm   #mongodb模塊

接下來(lái),我們需要準(zhǔn)備一個(gè)通用函數(shù)模擬UserAgent做一個(gè)簡(jiǎn)單的反爬處理

class Config():
    def getHeaders(self):
        user_agent_list = [ \
            "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1" \
            "Mozilla/5.0 (X11; CrOS i686 2268.111.0) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11", \
            "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1092.0 Safari/536.6", \
            "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1090.0 Safari/536.6", \
            "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/19.77.34.5 Safari/537.1", \
            "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.9 Safari/536.5", \
            "Mozilla/5.0 (Windows NT 6.0) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.36 Safari/536.5", \
            "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3", \
            "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3", \
            "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_0) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3", \
            "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3", \
            "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3", \
            "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3", \
            "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3", \
            "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3", \
            "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.0 Safari/536.3", \
            "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24", \
            "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24"
        ]
        UserAgent=random.choice(user_agent_list)
        headers = {'User-Agent': UserAgent}
        return headers

編寫生產(chǎn)者的類和核心代碼,Producer繼承threading.Thread

#生產(chǎn)者
class Producer(threading.Thread):

    def run(self):
        print("線程啟動(dòng)...")
        headers = Config().getHeaders()

if __name__ == "__main__":
    p = Producer()
    p.start()

測(cè)試運(yùn)行,一下,看是否可以啟動(dòng)

[linuxboy@bogon moocspider]$ python3 demo.py
線程啟動(dòng)...
{'User-Agent': 'Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24'}
[linuxboy@bogon moocspider]$ 

如果上面的代碼沒(méi)有問(wèn)題,接下來(lái)就是我們爬蟲代碼部分了,為了方便多線程之間的調(diào)用,我們還是創(chuàng)建一個(gè)共享變量在N個(gè)線程之間調(diào)用

# -*- coding: UTF-8 -*-
import requests
import random
import re
import time
import threading
import pymongo as pm

 # 獲取連接
client = pm.MongoClient('localhost', 21111)  # 端口號(hào)是數(shù)值型

# 連接目標(biāo)數(shù)據(jù)庫(kù)
db = client.moko

# 數(shù)據(jù)庫(kù)用戶驗(yàn)證
db.authenticate("moko", "moko")

urls = ["http://www.moko.cc/subscribe/chenhaoalex/1.html"]
index = 0   #索引
g_lock = threading.Lock()  #初始化一個(gè)鎖  

#生產(chǎn)者
class Producer(threading.Thread):

    def run(self):
        print("線程啟動(dòng)...")
        headers = Config().getHeaders()
        print(headers)
        global urls
        global index 
        while True:
            g_lock.acquire() 
            if len(urls)==0:
                g_lock.release() 
                continue
            page_url = urls.pop()
            g_lock.release() #使用完成之后及時(shí)把鎖給釋放,方便其他線程使用
            response = ""
            try:
                response = requests.get(page_url,headers=headers,timeout=5)

            except Exception as http:
                print("生產(chǎn)者異常")
                print(http)
                continue       
            content = response.text 

            rc = re.compile(r'<a class=\"imgBorder\" href=\"\/(.*?)\" hidefocus=\"true\">')
            follows = rc.findall(content)
            print(follows)
            fo_url = []
            threading_links_2 = []
            for u in follows:   
                this_url = "http://www.moko.cc/subscribe/%s/1.html" % u 
                g_lock.acquire()
                index += 1 
                g_lock.release()
                fo_url.append({"index":index,"link":this_url})
                threading_links_2.append(this_url)

            g_lock.acquire()
            urls += threading_links_2
            g_lock.release()
            print(fo_url)

            try:
                db.text.insert_many(fo_url,ordered=False )
            except:
                continue

if __name__ == "__main__":
    p = Producer()
    p.start()

上面代碼除了基本操作以外,我做了一些細(xì)小的處理

現(xiàn)在說(shuō)明如下

fo_url.append({"index":index,"link":this_url})

這部分代碼,是為了消費(fèi)者使用時(shí)候,方便進(jìn)行查找并且刪除操作而特意改造的,增加了一個(gè)字段index作為標(biāo)識(shí)

第二個(gè)部分,插入數(shù)據(jù)的時(shí)候,我進(jìn)行了批量的操作使用的是insert_many函數(shù),并且關(guān)鍵的地方,我增加了一個(gè)ordered=False的操作,這個(gè)地方大家可以自行研究一下,我的目的是去掉重復(fù)數(shù)據(jù),默認(rèn)情況下insert_many函數(shù)如果碰到數(shù)據(jù)重復(fù),并且在mongodb中創(chuàng)建了索引==創(chuàng)建索引的辦法,大家自行翻閱文章上面==,那么是無(wú)法插入的,但是這樣子會(huì)插入一部分,只把重復(fù)的地方略過(guò),非常方便。

關(guān)于pymongo的使用,大家可以參考官網(wǎng)手冊(cè)

這個(gè)是 pymongo的官方教程

http://api.mongodb.com/python/current/api/pymongo/collection.html?highlight=insert_many#pymongo.collection.Collection.insert_many

MongoDB的手冊(cè)大家也可以參考

https://docs.mongodb.com/manual/reference/method/db.collection.insertMany/

 db.text.insert_many(fo_url,ordered=False )

我們鏈接上MongoDB數(shù)據(jù)庫(kù),查詢一下我們剛剛插入的數(shù)據(jù)


> show collections
col
links
text
> db.text
moko.text
> db.text.find()
{ "_id" : ObjectId("5b1789e0c3666e642364a70b"), "index" : 1, "link" : "http://www.moko.cc/subscribe/dde760d5dd6a4413aacb91d1b1d76721/1.html" }
{ "_id" : ObjectId("5b1789e0c3666e642364a70c"), "index" : 2, "link" : "http://www.moko.cc/subscribe/3cc82db2231a4449aaa97ed8016b917a/1.html" }
.......
{ "_id" : ObjectId("5b1789e0c3666e642364a71e"), "index" : 20, "link" : "http://www.moko.cc/subscribe/8c1e4c738e654aad85903572f9090adb/1.html" }
Type "it" for more

其實(shí)上面代碼,有一個(gè)非常嚴(yán)重的BUG,就是當(dāng)我們實(shí)際操作的時(shí)候,發(fā)現(xiàn),我們每次獲取到的都是我們使用this_url = "http://www.moko.cc/subscribe/%s/1.html" % u 進(jìn)行拼接的結(jié)果。

也就是說(shuō),我們獲取到的永遠(yuǎn)都是第1頁(yè)。這個(gè)按照我們之前設(shè)計(jì)的就不符合邏輯了,

我們還要獲取到分頁(yè)的內(nèi)容,那么這個(gè)地方需要做一個(gè)簡(jiǎn)單的判斷,就是下面的邏輯了。

==如果完整代碼,大家不知道如何觀看,可以直接翻閱到文章底部,有對(duì)應(yīng)的github鏈接==

#如果是第一頁(yè),那么需要判斷一下
#print(page_url)
is_home =re.search(r'(\d*?)\.html',page_url).group(1)
if is_home == str(1):
    pages = re.findall(r'onfocus=\"this\.blur\(\)\">(\d*?)<',content,re.S)   #獲取總頁(yè)數(shù)
    page_size = 1
    if pages:
        page_size = int(max(pages))   #獲取最大頁(yè)數(shù)
        if page_size > 1:   #如果最大頁(yè)數(shù)大于1,那么獲取所有的頁(yè)面
            url_arr = []
            threading_links_1 = []
            for page in range(2,page_size+1):
                url =  re.sub(r'(\d*?)\.html',str(page)+".html",page_url)  
                threading_links_1.append(url)
                g_lock.acquire()
                index += 1 
                g_lock.release()

                url_arr.append({ "index":index, "link": url})

            g_lock.acquire()
            urls += threading_links_1  #  URL數(shù)據(jù)添加
            g_lock.release()
            try:
                db.text.insert_many(url_arr,ordered=False )
            except Exception as e:
                print("數(shù)據(jù)庫(kù)輸入異常")
                print (e)
                continue

        else:
            pass
    else:
            pass

截止到現(xiàn)在為止,其實(shí)你已經(jīng)實(shí)現(xiàn)了鏈接的生產(chǎn)者了 。

我們?cè)贛ongoDB中生成了一堆鏈接,接下來(lái)就是使用階段了。

使用起來(lái)也是非常簡(jiǎn)單。

我先給大家看一個(gè)比較復(fù)雜的正則表達(dá)式爬蟲寫的好不好,正則表達(dá)式站很重要的比例哦~

divEditOperate_(?P<ID>\d*)[\"] .*>[\s\S]*?<p class=\"state\">.*?(?P<級(jí)別>\w*P).*</span></span>(?P<是否認(rèn)證><br/>)?.*?</p>[\s\S]*?<div class=\"info clearfix\">[\s\S]*?<a class=\"imgBorder\" href=\"\/(?P<主頁(yè)>.*?)\" hidefocus=\"true\">[\s\S]*?<img .*?src=\"(?P<頭像>.*?)\".*?alt=\".*?\" title=\"(?P<昵稱>.*?)\" />[\s\S]*?<p class=\"font12 lesserColor\">(?P<地點(diǎn)>.*?)&nbsp.*?<span class=\"font12 mainColor\">(?P<粉絲數(shù)目>\d*?)</span>

上面這個(gè)正則表達(dá)式,就是我為

http://www.moko.cc/subscribe/chenhaoalex/1.html 

這個(gè)頁(yè)面專門準(zhǔn)備的。

這樣子,我就可以直接獲取到我想要的所有數(shù)據(jù)了。

Python爬蟲入門【3】:美空網(wǎng)數(shù)據(jù)爬取

消費(fèi)者的代碼如下

get_index = 0
#消費(fèi)者類
class Consumer(threading.Thread):

    def run(self):
        headers = Config().getHeaders()

        global get_index 
        while True:

            g_lock.acquire() 
            get_index += 1
            g_lock.release()
            #從剛才數(shù)據(jù)存儲(chǔ)的列里面獲取一條數(shù)據(jù),這里用到find_one_and_delete方法
            #get_index 需要聲明成全局的變量
            link = db.links.find_one_and_delete({"index":get_index})
            page_url = ""
            if link:
                page_url = link["link"]
                print(page_url+">>>網(wǎng)頁(yè)分析中...")
            else:
                continue

            response = ""
            try:
                response = requests.get(page_url,headers=headers,timeout=5)

            except Exception as http:
                print("消費(fèi)者有異常")
                print(http)
                continue

            content = response.text 
            rc = re.compile(r'divEditOperate_(?P<ID>\d*)[\"] .*>[\s\S]*?<p class=\"state\">.*?(?P<級(jí)別>\w*P).*</span></span>(?P<是否認(rèn)證><br/>)?.*?</p>[\s\S]*?<div class=\"info clearfix\">[\s\S]*?<a class=\"imgBorder\" href=\"\/(?P<主頁(yè)>.*?)\" hidefocus=\"true\">[\s\S]*?<img .*?src=\"(?P<頭像>.*?)\".*?alt=\".*?\" title=\"(?P<昵稱>.*?)\" />[\s\S]*?<p class=\"font12 lesserColor\">(?P<地點(diǎn)>.*?)&nbsp.*?<span class=\"font12 mainColor\">(?P<粉絲數(shù)目>\d*?)</span>')
            user_info = rc.findall(content)
            print(">>>>>>>>>>>>>>>>>>>>")
            users = []
            for user in user_info:
                post = {
                    "id": user[0],
                    "level": user[1],
                    "real":user[2],
                    "profile": user[3],
                    'thumb':user[4],
                    'nikename':user[5],
                    'address':user[6],
                    'follows':user[7]
                }

                users.append(post)
            print(users)

            try:
                db.mkusers.insert_many(users,ordered=False )
            except Exception as e:
                print("數(shù)據(jù)庫(kù)輸入異常")
                print (e)
                continue

            time.sleep(1)

            print("<<<<<<<<<<<<<<<<<<<<")
Python資源分享qun 784758214 ,內(nèi)有安裝包,PDF,學(xué)習(xí)視頻,這里是Python學(xué)習(xí)者的聚集地,零基礎(chǔ),進(jìn)階,都?xì)g迎

當(dāng)你使用python3 demo.py 編譯demo之后,屏幕滾動(dòng)如下結(jié)果,那么你成功了。

接下來(lái)就可以去數(shù)據(jù)庫(kù)查閱數(shù)據(jù)去了。

[linuxboy@bogon moocspider]$ python3 demo.py
線程啟動(dòng)...
{'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3'}
http://www.moko.cc/subscribe/chenhaoalex/2.html>>>網(wǎng)頁(yè)分析中...
['dde760d5dd6a4413aacb91d1b1d76721', '3cc82db2231a4449aaa97ed8016b917a', 'a1835464ad874eec92ccbb31841a7590', 'c9ba6a47a246494398d4e26c1e0b7e54', '902fe175e668417788a4fb5d4de7ab99', 'dcb8f11265594f17b821a6d90caf96a7', '7ea0a96621eb4ed99c9c642936559c94', 'd45c1e3069c24152abdc41c1fb342b8f', 'chenyiqiu', '798522844', 'MEERILLES', 'ddfd9e1f7dca4cffb2430caebd2494f8', 'd19cbd37c87e400e9da42e159560649b', 'ac07e7fbfde14922bb1d0246b9e4374d', '05abc72ac7bb4f738f73028fed17ac23', 'hanzhuoer', 'e12e15aaee654b8aa9f528215bc3294c', '3b6d8dc6fd814789bd484f393b5c9fa8', '83256b93a2f94f449ab75c730cb80a7b', '8c1e4c738e654aad85903572f9090adb']
[{'index': 77, 'link': 'http://www.moko.cc/subscribe/dde760d5dd6a4413aacb91d1b1d76721/1.html'}, {'index': 78, 'link': 'http://www.moko.cc/subscribe/3cc82db2231a4449aaa97ed8016b917a/1.html'}, {'index': 79, 'link': 'http://www.moko.cc/subscribe/a1835464ad874eec92ccbb31841a7590/1.html'}, {'index': 80, 'link': 'http://www.moko.cc/subscribe/c9ba6a47a246494398d4e26c1e0b7e54/1.html'}, {]
>>>>>>>>>>>>>>>>>>>>
[{'id': '3533155', 'level': 'MP', 'real': '', 'profile': 'b1a7e76455cc4ca4b81ed800ab68b308', 'thumb': 'http://img.mb.moko.cc/2018-02-17/d7db42d4-7f34-46d2-a760-c88eb90d6e0d.jpg', 'nikename': '模特九九', 'address': '大連', 'follows': '10'}, {'id': '3189865', 'level': 'VIP', 'real': '', 'profile': 'cfdf1482a9034f65a60bc6a1cf8d6a02', 'thumb': 'http://img.mb.moko.cc/2016-09-30/98c1ddd3-f9a8-4a15-a106-5d664fa7b558.jpg', 'nikename': '何應(yīng)77', 'address': '杭州', 'follows': '219'}, {'id': '14886', 'level': 'VIP', 'real': '<br/>', 'profile': 'cndp', 'thumb': 'http://img2.moko.cc/users/0/49/14886/logo/img2_des_x3_10100286.jpg', 'nikename': '多拍PGirl', 'address': '北京', 'follows': '2331'}, {'id': '3539257', 'level': 'MP', 'real': '<br/>', 'profile': '605c8fb2824049aa841f21858a7fd142', 'thumb': 'http://img.mb.moko.cc/2018-02':

記得處理數(shù)據(jù)的時(shí)候去掉重復(fù)值

>show collections
col
links
mkusers
text
> db.mkusers.find()
{ "_id" : ObjectId("5b17931ec3666e6eff3953bc"), "id" : "3533155", "level" : "MP", "real" : "", "profile" : "b1a7e76455cc4ca4b81ed800ab68b308", "thumb" : "http://img.mb.moko.cc/2018-02-17/d7db42d4-7f34-46d2-a760-c88eb90d6e0d.jpg", "nikename" : "模特九九", "address" : "大連", "follows" : "10" }
{ "_id" : ObjectId("5b17931ec3666e6eff3953bd"), "id" : "3189865", "level" : "VIP", "real" : "", "profile" : "cfdf1482a9034f65a60bc6a1cf8d6a02", "thumb" : "http://img.mb.moko.cc/2016-09-30/98c1ddd3-f9a8-4a15-a106-5d664fa7b558.jpg", "nikename" : "何應(yīng)77", "address" : "杭州", "follows" : "219" }
{ "_id" : ObjectId("5b17931ec3666e6eff3953be"), "id" : "14886", "level" : "VIP", "real" : "<br/>", "profile" : "cndp", "thumb" : "http://img2.moko.cc/users/0/49/14886/logo/img2_des_x3_10100286.jpg", "nikename" : "多拍PGirl", "address" : "北京", "follows" : "2331" }
{ "_

最后一步,如果你想要把效率提高,修改線程就好了

if __name__ == "__main__":

    for i in range(5):
        p = Producer()
        p.start()

    for i in range(7):
        c = Consumer()
        c.start()
Python資源分享qun 784758214 ,內(nèi)有安裝包,PDF,學(xué)習(xí)視頻,這里是Python學(xué)習(xí)者的聚集地,零基礎(chǔ),進(jìn)階,都?xì)g迎

經(jīng)過(guò)3個(gè)小時(shí)的爬取,我獲取了70000多美空的用戶ID,原則上,你可以獲取到所有的被關(guān)注者的,不過(guò)這些數(shù)據(jù)對(duì)我們測(cè)試來(lái)說(shuō),已經(jīng)足夠使用。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI