您好,登錄后才能下訂單哦!
從今天開始,我們嘗試用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ī)律到底是啥?
http://www.moko.cc/post/978c74a0375f4edca114e87b0a45a0b5/list.html
http://www.moko.cc/post/jundayi/list.html
http://www.moko.cc/post/slavik/list.html
沒(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é)果
哎呀,還么有權(quán)限,誰(shuí)有權(quán)限,可以跟我交流一下,一時(shí)激動(dòng),差點(diǎn)去下載他們的APP,然后進(jìn)行抓包去。
上面兩條路,都不好弄,接下來(lái)繼續(xù)找路子。
無(wú)意中,我看到了一絲曙光
關(guān)注名單,點(diǎn)進(jìn)去
哈哈哈,OK了,這不就是,我要找到的東西嗎?
不多說(shuō)了,爬蟲走起,測(cè)試一下他是否有反扒機(jī)制。
我找到了一個(gè)關(guān)注的人比較多的頁(yè)面,1500多個(gè)人
http://www.moko.cc/subscribe/chenhaoalex/1.html
然后又是一波分析操作
確定了爬蟲的目標(biāo),接下來(lái),我做了兩件事情,看一下,是否對(duì)你也有幫助
對(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é)果
接下來(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í)際操作一把。
使用 pip3 安裝pymongo庫(kù)
使用pymongo模塊連接mongoDB數(shù)據(jù)庫(kù)
一些準(zhǔn)備工作
創(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
>
權(quán)限不足
db.createUser({user: "userAdmin",pwd: "123456", roles: [ { role: "userAdminAnyDatabase", db: "admin" } ] } )
db.auth("userAdmin","123456")
> 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迎
> 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"
}
]
}
>
db.auth("dba","dba")
> db.createCollection("demo")
{ "ok" : 1 }
> db.collections
dm.collections
> show collections
demo
>
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())
[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)題。
首先,我需要?jiǎng)?chuàng)造一個(gè)不斷抓取鏈接的類
這個(gè)類做的事情,就是分析
http://www.moko.cc/subscribe/chenhaoalex/1.html
這個(gè)頁(yè)面,總共有多少頁(yè),然后生成鏈接
抓取頁(yè)面中的總頁(yè)數(shù)為77
正則表達(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)如下
通過(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)>.*?) .*?<span class=\"font12 mainColor\">(?P<粉絲數(shù)目>\d*?)</span>
上面這個(gè)正則表達(dá)式,就是我為
http://www.moko.cc/subscribe/chenhaoalex/1.html
這個(gè)頁(yè)面專門準(zhǔn)備的。
這樣子,我就可以直接獲取到我想要的所有數(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)>.*?) .*?<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)足夠使用。
免責(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)容。