Python爬虫入门教程 3-100 美空网数据爬取

1.美空网数据-简介

从今天开始,我们尝试用2篇博客的内容量,搞定一个网站叫做“美空网”网址为:http://www.moko.cc/, 这个网站我剖析了一下,我们要爬取的图片在 下面这个网址

http://www.moko.cc/post/13020…

然后在去剖析一下,我需要找到一个图片列表页面是最好的,作为一个勤奋的爬虫coder,我找到了这个页面

http://www.moko.cc/post/da39d…

列表页面被我找到了,貌似没有分页,这就简朴多了,然则刚想要爬,就翻车了,我发明一个严峻的题目。

http://www.moko.cc/post/==da3…

我要做的是一个自动化的爬虫,然则我发明,出题目了,上面谁人黄色背景的位置是啥?

ID,昵称,特性首页,这个必需要搞定。

我接下来随机的找了一些图片列表页,试图找到规律究竟是啥?

  1. http://www.moko.cc/post/978c7…
  2. http://www.moko.cc/post/junda…
  3. http://www.moko.cc/post/slavi…
  4. ……

没什么题目,发明规律了

http://www.moko.cc/post/==个…

这就有点意义了,我假如能找到只管多的昵称,不就能够拼接出来我想要得一切所在了吗

开干!!!

手腕,全站乱点,找进口,找切入点,找是不是有API

…. …. 效果没找着

下面的一些备选计划

趴这个页面,发明只要 20页 http://www.moko.cc/channels/p…

每页48个模特,20页。那末也才960人啊,完全掩盖不到只管多的用户。

接着又找到

http://www.moko.cc/catalog/in… 这个页面

确认了一下眼神,认为发明题目了,效果

《Python爬虫入门教程 3-100 美空网数据爬取》

哎呀,还么有权限,谁有权限,能够跟我交换一下,一时冲动,差点去下载他们的APP,然后举行抓包去。

上面两条路,都不好弄,接下来继续找门路。

无意中,我看到了一丝曙光

《Python爬虫入门教程 3-100 美空网数据爬取》

关注名单,点进去

《Python爬虫入门教程 3-100 美空网数据爬取》

哈哈哈,OK了,这不就是,我要找到的东西吗?

不多说了,爬虫走起,测试一下他是不是有反扒机制。

我找到了一个关注的人比较多的页面,1500多个人

http://www.moko.cc/subscribe/…

然后又是一波剖析操纵

2.美空网数据- 爬虫数据存储

肯定了爬虫的目标,接下来,我做了两件事变,看一下,是不是对你也有协助

  1. 肯定数据存储在那里?末了我挑选了MongoDB
  2. 用正则表达式去剖析网页数据

对此,我们需要装置一下MongoDB,装置的要领肯定是官网教程啦!

https://docs.mongodb.com/mast…

假如官方文档没有协助你装置胜利。

那末我引荐下面这篇博客

https://www.cnblogs.com/hacky…

装置MongoDB涌现以下效果

《Python爬虫入门教程 3-100 美空网数据爬取》

祝贺你装置胜利了。

接下来,你要进修的是 关于mongodb用户权限的治理

http://www.cnblogs.com/shiyiw…

mongodb索引的建立

https://blog.csdn.net/salmone…

别问为啥我不从新写一遍,懒呗~~~ 何况这些材料太多了,互联网大把大把的。

一些我经经常运用的mongdb的敕令


链接 mongo --port <端口号>

挑选数据库 use admin 

展现当前数据库  db 

当前数据库受权  db.auth("用户名","暗码")

检察数据库  show dbs

检察数据库中的列名  show collections 

建立列  db.createCollection("列名")

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

展现一切索引 db.col.getIndexes()

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

查找数据  db.列名.find()

查询数据总条数  db.列名.find().count() 

上面基础是我最经常运用的了,我们下面实际操纵一把。

用Python链接MongoDB

运用 pip3 装置pymongo库

运用pymongo模块衔接mongoDB数据库

一些预备工作

  1. 建立dm数据库

    链接上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. 设置用户权限:接着上面输入敕令 show dbs 检察权限

《Python爬虫入门教程 3-100 美空网数据爬取》

权限不足

  1. 建立治理用户
db.createUser({user: "userAdmin",pwd: "123456", roles: [ { role: "userAdminAnyDatabase", db: "admin" } ] } )
  1. 受权用户
db.auth("userAdmin","123456")
  1. 检察权限
> db.auth("userAdmin","123456")
1
> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB
moko    0.013GB
test    0.000GB
> 
  1. 接下来建立 dm数据库<在这之前还需要建立一个读写用户>
> 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. 从新受权
db.auth("dba","dba")
  1. 建立一列数据
> db.createCollection("demo")
{ "ok" : 1 }
> db.collections
dm.collections
> show collections
demo
> 

  1. Python完成插进去操纵
import pymongo as pm  #确保你已装置过pymongo了

 # 猎取衔接
client = pm.MongoClient('localhost', 21111)  # 端口号是数值型

# 衔接目标数据库
db = client.dm

# 数据库用户考证
db.authenticate("dba", "dba")
post = {
        "id": "111111",
        "level": "MVP",
        "real":1,
        "profile": '111',
        'thumb':'2222',
        'nikename':'222',
        'follows':20
}

db.col.insert_one(post) # 插进去单个文档

# 打印鸠合第1条纪录
print (db.col.find_one())
  1. 编译实行
[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]$ 

好了,我们到如今为止,完成了mongodb的插进去题目。

3.美空网数据-用Python 爬取关注对象

起首,我需要制造一个不停抓取链接的类

这个类做的事变,就是剖析

http://www.moko.cc/subscribe/…

这个页面,总共有若干页,然后天生链接

《Python爬虫入门教程 3-100 美空网数据爬取》

抓取页面中的总页数为77

《Python爬虫入门教程 3-100 美空网数据爬取》

正则表达式以下

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

在这里,由一切的分页都一样,所以,我匹配了悉数的页码,然后计算了数组中的最大值

#猎取页码数组
pages = re.findall(r'onfocus=\"this\.blur\(\)\">(\d*?)<',content,re.S)   #猎取总页数
page_size = 1
if pages:  #假如数组不为空
    page_size = int(max(pages))   #猎取最大页数
                    

接下来就是我们要搞定的生产者编码阶段了,我们需要打造一个不停猎取衔接的爬虫

简朴的说就是

我们需要一个爬虫,不停的去爬取

http://www.moko.cc/subscribe/… 这个页面中一切的用户,而且还要爬取到总页数。

比方检察上述页面中,我们要猎取的症结点以下

《Python爬虫入门教程 3-100 美空网数据爬取》

经由过程这个页面,我们要获得,这模样的一个数组,注重下面数组中有个位置【我用爬虫爬到的】这个就是症结的处所了

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   #收集要求模块
import random     #随机模块
import re         #正则表达式模块
import time       #时刻模块
import threading  #线程模块
import pymongo as pm   #mongodb模块

接下来,我们需要预备一个通用函数模仿UserAgent做一个简朴的反爬处置惩罚

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

编写生产者的类和中心代码,Producer继续threading.Thread

#生产者
class Producer(threading.Thread):
    
    def run(self):
        print("线程启动...")
        headers = Config().getHeaders()

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

测试运行,一下,看是不是能够启动

[linuxboy@bogon moocspider]$ python3 demo.py
线程启动...
{'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]$ 

假如上面的代码没有题目,接下来就是我们爬虫代码部份了,为了轻易多线程之间的挪用,我们照样建立一个同享变量在N个线程之间挪用

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

 # 猎取衔接
client = pm.MongoClient('localhost', 21111)  # 端口号是数值型

# 衔接目标数据库
db = client.moko

# 数据库用户考证
db.authenticate("moko", "moko")

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



#生产者
class Producer(threading.Thread):
    
    def run(self):
        print("线程启动...")
        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() #运用完成以后实时把锁给开释,轻易其他线程运用
            response = ""
            try:
                response = requests.get(page_url,headers=headers,timeout=5)
                
            except Exception as http:
                print("生产者异常")
                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()





上面代码除了基础操纵之外,我做了一些微小的处置惩罚

如今申明以下

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

这部份代码,是为了消费者运用时刻,轻易举行查找而且删除操纵而特地革新的,增加了一个字段index作为标识

第二个部份,插进去数据的时刻,我举行了批量的操纵运用的是insert_many函数,而且症结的处所,我增加了一个ordered=False的操纵,这个处所人人能够自行研究一下,我的目标是去掉反复数据,默许情况下insert_many函数假如遇到数据反复,而且在mongodb中建立了索引==建立索引的要领,人人自行翻阅文章上面==,那末是没法插进去的,然则这模样会插进去一部份,只把反复的处所略过,异常轻易。

关于pymongo的运用,人人能够参考官网手册

这个是 pymongo的官方教程

http://api.mongodb.com/python…

MongoDB的手册人人也能够参考

https://docs.mongodb.com/manu…

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

我们链接上MongoDB数据库,查询一下我们方才插进去的数据


> 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

实在上面代码,有一个异常严峻的BUG,就是当我们实际操纵的时刻,发明,我们每次猎取到的都是我们运用this_url = "http://www.moko.cc/subscribe/%s/1.html" % u 举行拼接的效果。

也就是说,我们猎取到的永远都是第1页。这个根据我们之前设想的就不相符逻辑了,

我们还要猎取到分页的内容,那末这个处所需要做一个简朴的推断,就是下面的逻辑了。

==假如完全代码,人人不知道怎样寓目,能够直接翻阅到文章底部,有对应的github链接==

#假如是第一页,那末需要推断一下
#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)   #猎取总页数
    page_size = 1
    if pages:
        page_size = int(max(pages))   #猎取最大页数
        if page_size > 1:   #假如最大页数大于1,那末猎取一切的页面
            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数据增加
            g_lock.release()
            try:
                db.text.insert_many(url_arr,ordered=False )
            except Exception as e:
                print("数据库输入异常")
                print (e)
                continue
            
        else:
            pass
    else:
            pass

停止到如今为止,实在你已完成了链接的生产者了 。

我们在MongoDB中天生了一堆链接,接下来就是运用阶段了。

运用起来也是异常简朴。

我先给人人看一个比较复杂的正则表达式爬虫写的好不好,正则表达式站很主要的比例哦~

divEditOperate_(?P<ID>\d*)[\"] .*>[\s\S]*?<p class=\"state\">.*?(?P<级别>\w*P).*</span></span>(?P<是不是认证><br/>)?.*?</p>[\s\S]*?<div class=\"info clearfix\">[\s\S]*?<a class=\"imgBorder\" href=\"\/(?P<主页>.*?)\" hidefocus=\"true\">[\s\S]*?<img .*?src=\"(?P<头像>.*?)\".*?alt=\".*?\" title=\"(?P<昵称>.*?)\" />[\s\S]*?<p class=\"font12 lesserColor\">(?P<所在>.*?)&nbsp.*?<span class=\"font12 mainColor\">(?P<粉丝数量>\d*?)</span>

上面这个正则表达式,就是我为

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

这个页面特地预备的。

这模样,我就能够够直接猎取到我想要的一切数据了。

《Python爬虫入门教程 3-100 美空网数据爬取》

消费者的代码以下

get_index = 0
#消费者类
class Consumer(threading.Thread):
    
    def run(self):
        headers = Config().getHeaders()

        global get_index 
        while True:
            
            g_lock.acquire() 
            get_index += 1
            g_lock.release()
            #从适才数据存储的列内里猎取一条数据,这里用到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+">>>网页剖析中...")
            else:
                continue

            response = ""
            try:
                response = requests.get(page_url,headers=headers,timeout=5)
                
            except Exception as http:
                print("消费者有异常")
                print(http)
                continue
            
            content = response.text 
            rc = re.compile(r'divEditOperate_(?P<ID>\d*)[\"] .*>[\s\S]*?<p class=\"state\">.*?(?P<级别>\w*P).*</span></span>(?P<是不是认证><br/>)?.*?</p>[\s\S]*?<div class=\"info clearfix\">[\s\S]*?<a class=\"imgBorder\" href=\"\/(?P<主页>.*?)\" hidefocus=\"true\">[\s\S]*?<img .*?src=\"(?P<头像>.*?)\".*?alt=\".*?\" title=\"(?P<昵称>.*?)\" />[\s\S]*?<p class=\"font12 lesserColor\">(?P<所在>.*?)&nbsp.*?<span class=\"font12 mainColor\">(?P<粉丝数量>\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("数据库输入异常")
                print (e)
                continue

            time.sleep(1)

            print("<<<<<<<<<<<<<<<<<<<<")

当你运用python3 demo.py 编译demo以后,屏幕转动以下效果,那末你胜利了。

接下来就能够够去数据库查阅数据去了。

[linuxboy@bogon moocspider]$ python3 demo.py
线程启动...
{'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>>>网页剖析中...
['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': '何应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':

记得处置惩罚数据的时刻去掉反复值

>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" : "何应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()

经由3个小时的爬取,我猎取了70000多美空的用户ID,原则上,你能够猎取到一切的被关注者的,不过这些数据对我们测试来讲,已充足运用。

    原文作者:梦想橡皮擦
    原文地址: https://segmentfault.com/a/1190000019249589
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞