首页 文章 精选 留言 我的

精选列表

搜索[python],共10000篇文章
优秀的个人博客,低调大师

Python爬虫入门教程 16-100 500px摄影师社区抓取摄影师数据

1. 500px摄影师社区-写在前面 今天要抓取的网站为 https://500px.me/ ,这是一个摄影社区,在一个摄影社区里面本来应该爬取的是图片信息,可是我发现好像也没啥有意思的,忽然觉得爬取一下这个网站的摄影师更好玩一些,所以就有了这篇文章的由来。 基于上面的目的,我找了了一个不错的页面 https://500px.me/community/search/user 不过细细分析之后,发现这个页面并不能抓取到尽可能多的用户,因为下拉一段时间,就不能继续了,十分糟心,难道我止步于此了么,显然不可能的,一番的努力之后(大概废了1分钟吧),我找到了突破口,任意打开一个用户的个人中心页,就是点击上述链接的任意用户头像,出现如下操作。 用户个人中心页面,竟然有关注列表唉~~,nice啊,这个好爬啊,F12分析一下。 哒哒哒,数据得到了。URL是 https://500px.me/community/res/relation/4f7fe110d4e0b8a1fae0632b2358c8898/follow?startTime=&page=1&size=10&type=json 参数分别如下,实际测试发现size可以设置为100 https://500px.me/community/res/relation/{用户ID}/follow?startTime=&page={页码}&size={每页数据}&type=json 那么我们只需要这么做就可以了 获取关注总数 关注总数除以100,循环得到所有的关注者(这个地方为什么用关注,不用粉丝,是因为被关注的人更加有价值)明确我们的目标之后,就可以开始写代码了。 2.500px摄影师社区-撸代码 基本操作,获取网络请求,之后解析页面,取得关注总数。 用户的起始,我选择的id是5769e51a04209a9b9b6a8c1e656ff9566,你可以随机选择一个,只要他有关注名单,就可以。导入模块,这篇博客,用到了redis和mongo,所以相关的基础知识,我建议你提前准备一下,否则看起来吃力。 import requests import threading from redis import StrictRedis import pymongo #########mongo部分######################### DATABASE_IP = '127.0.0.1' DATABASE_PORT = 27017 DATABASE_NAME = 'sun' client = pymongo.MongoClient(DATABASE_IP,DATABASE_PORT) db = client.sun db.authenticate("dba", "dba") collection = db.px500 # 准备插入数据 #########mongo部分######################### #########redis部分######################### redis = StrictRedis(host="localhost",port=6379,db=1,decode_responses=True) #########redis部分######################### #########全局参数部分######################### START_URL = "https://500px.me/community/v2/user/indexInfo?queriedUserId={}" # 入口链接 COMMENT = "https://500px.me/community/res/relation/{}/follow?startTime=&page={}&size=100&type=json" HEADERS = { "Accept":"application/json", "User-Agent":"你自己去找找可用的就行", "X-Requested-With":"XMLHttpRequest" } need_crawlids = [] # 待爬取的userid lock = threading.Lock() # 线程锁 #########全局参数部分######################### def get_followee(): try: res = requests.get(START_URL.format("5769e51a04209a9b9b6a8c1e656ff9566"), headers=HEADERS,timeout=3) data = res.json() if data: totle = int(data["data"]["userFolloweeCount"]) # 返回关注数 userid = data["data"]["id"] # 返回用户ID return { "userid":userid, "totle":totle } # 返回总数据 except Exception as e: print("数据获取错误") print(e) if __name__ == '__main__': start = get_followee() # 获取入口 need_crawlids.append(start) 上面代码中有一个非常重要的逻辑,就是为什么要先匹配种子地址的【关注数】和【用户ID】,这两个值是为了拼接下面的URLhttps://500px.me/community/res/relation/{}/follow?startTime=&page={}&size=100&type=json经过分析,你已经知道,这个地方第一个参数是用户id,第二个参数是页码page,page需要通过关注总数除以100得到。不会算的,好好在纸上写写吧~ 我们可以通过一个方法,获取到了种子用户的关注列表,以此继续爬取下去,完善生产者代码。关键代码都进行了注释标注。 思路如下: 死循环不断获取need_crawlids 变量中的用户,然后获取该用户的关注者列表。 爬取到的信息,写入redis方便验证重复,快速存储。 class Product(threading.Thread): def __init__(self): threading.Thread.__init__(self) self._headers = HEADERS def get_follows(self,userid,totle): try: res = requests.get(COMMENT.format(userid,totle),headers=HEADERS,timeout=3) data = res.json() if data: for item in data: yield { "userid":item["id"], "totle":item["userFolloweeCount"] } except Exception as e: print("错误信息") print(e) self.get_follows(userid,totle) # 出错之后,重新调用 def run(self): while 1: global need_crawlids # 调用全局等待爬取的内容 if lock.acquire(): if len(need_crawlids)==0: # 如果为0,无法进入循环 continue data = need_crawlids[0] # 取得第一个 del need_crawlids[0] # 使用完删除 lock.release() if data["totle"] == 0: continue for page in range(1,data["totle"]//100+2): for i in self.get_follows(data["userid"],page): if lock.acquire(): need_crawlids.append(i) # 新获取到的,追加到等待爬取的列表里面 lock.release() self.save_redis(i) # 存储到redis里面 def save_redis(self,data): redis.setnx(data["userid"],data["totle"]) #print(data,"插入成功") 由于500px无反爬虫,所以运行起来速度也是飞快了,一会就爬取了大量的数据,目测大概40000多人,由于咱是写教程的,我停止了爬取。 这些数据不能就在redis里面趴着,我们要用它获取用户的所有信息,那么先找到用户信息接口,其实在上面已经使用了一次https://500px.me/community/v2/user/indexInfo?queriedUserId={} 后面的queriedUserId对应的是用户id,只需要从刚才的数据里面获取redis的key就可以了,开始编写消费者代码吧,我开启了5个线程抓取。 class Consumer(threading.Thread): def __init__(self): threading.Thread.__init__(self) def run(self): while 1: key = redis.randomkey() # 随机获取一个key if key: # 删除获取到的key redis.delete(key) self.get_info(key) def get_info(self,key): try: res = requests.get(START_URL.format(key),headers=HEADERS,timeout=3) data = res.json() if data['status'] == "200": collection.insert(data["data"]) # 插入到mongodb中 except Exception as e: print(e) return if __name__ == '__main__': start = get_followee() # 获取入口 need_crawlids.append(start) p = Product() p.start() for i in range(1,5): c = Consumer() c.start() 代码没有特别需要注意的,可以说非常简单了,关于redis使用也不多。 redis.randomkey() # 随机获取一个key redis.delete(key) # 删除key (⊙o⊙)…经过几分钟的等待之后,大量的用户信息就来到了我的本地。 完整代码评论留言发送。

优秀的个人博客,低调大师

手把手教程:用Python开发一个自然语言处理模型,并用Flask进行部署

截住到目前为止,我们已经开发了许多机器学习模型,对测试数据进行了数值预测,并测试了结果。实际上,生成预测只是机器学习项目的一部分,尽管它是我认为最重要的部分。今天我们来创建一个用于文档分类、垃圾过滤的自然语言处理模型,使用机器学习来检测垃圾短信文本消息。我们的ML系统工作流程如下:离线训练->将模型作为服务提供->在线预测。 1、通过垃圾邮件和非垃圾邮件训练离线分类器。 2、经过训练的模型被部署为服务用户的服务。 当我们开发机器学习模型时,我们需要考虑如何部署它,即如何使这个模型可供其他用户使用。Kaggle和数据科学训练营非常适合学习如何构建和优化模型,但他们并没有教会工程师如何将它们带给其他用户使用,建立模型与实际为人们提供产品和服务之间存在重大差异。 在本文中,我们将重点关注:构建垃圾短信分类的机器学习模型,然后使用Fl

优秀的个人博客,低调大师

python:jieba:当你看完个这句子之后就会现发,里这词的字序是乱的

是这一个常非趣有的情事,先我出放码代:(得记要自己去pip下一jieba分词): import jieba import random as rd ctl=True while ctl: print('-'*30) msg=input('输入句子:\n') msg_words=list(jieba.cut(msg)) res=[] for word in msg_words: word=list(word) rd.shuffle(word) res.append(''.join(word)) print(''.join(res)) 我现在正在使用这个具工在IM软件上和人天聊,前目还没有人提出全完懂不看我在说什么,哈哈

优秀的个人博客,低调大师

手把手 | 用Python语言模型和LSTM做一个Drake饶舌歌词生成器

未来AI的主要应用是在建立能够学习数据然后生成原创内容的网络。这个想法已经充分应用于在自然语言处理(NLP)领域,这也是AI社区能够搭建出所谓语言模型的原因:语言模型的前提是学习句子在文章段落中的组成结构,从而生成新的内容。 在这篇文章中,我想尝试生成与很受欢迎的加拿大说唱歌手Drake(a.k.a. #6god)风格类似的说唱歌词,这肯定是件很有趣的事儿。 另外,我还想分享一下常规的机器学习项目渠道,因为我发现很多同学想做一些小项目,但不知道该从何处入手。 获取数据 首先,我们开始搜集Drake的曲库,为了节省时间我直接写了个爬虫,从网页metrolyrics.com抓取歌词。 import urllib.request as urllib2 from bs4 import BeautifulSoup import pandas a

资源下载

更多资源
Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

优质分享App

优质分享App

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册