通过一段时间对爬虫的学习,发现Scrapy框架真的是一个很好用的框架,接下来让我们用一个简单的例子,来见识一下Scrapy框架的强大之处.
本示例将获取新浪微博指定用户下的所有基本信息,粉丝和关注者,并且通过该用户的关注和粉丝继续深度爬出,简单来说,只要时间够多,ip够用,通过一个用户就可以得到新浪微博所有用户的基础信息

创建项目

scrapy startproject weibospider
目录层级如下:
weibospider-weibospider-spiders # 爬虫目录,创建爬虫文件-__init__.py_weibo.py   # 写入爬虫相关信息__init__.pyitems.py    # 设置数据存储模板,用于结构化数据,如Django中的modelsmiddlewares.py  # 设置中间下载键  可以设置请求头和IP池pipelines.py   # 一般结构化的数据持久化setting.py  # 爬虫运行的相关设置main.py   # 设置快捷启动scrapy.cfg   # 项目的配置信息,主要为Scrapy命令行工具提供一个基础的配置信息,主要的配置信息在setting.py中

爬取用户信息

import scrapy
from scrapy import Request
import json
from weibospider.items import UserItem, UserRelationItemclass WeiBoUserInfoSpider(scrapy.Spider):# 给爬虫唯一命名,通过此命名可以启动爬虫name = 'weibo'# 通过分析api接口,可以得的用户信息urluser_urls = 'https://m.weibo.cn/api/container/getIndex?uid={uid}type=uid&value={uid}&containerid=100505{uid}'# 通过分析api接口,可以得到该用户关注人的信息的urlfollowers_urls = 'https://m.weibo.cn/api/container/getIndex?containerid=231051_-_followers_-_{uid}&page={page}'# 通过分析api接口,可以得到该用户粉丝的信息的urlfans_urls = 'https://m.weibo.cn/api/container/getIndex?containerid=231051_-_fans_-_{uid}&since_id={since_id}'uid_lists = ['1767840980','1582188504','1759006061','3908615569']# start_requests 会循环生成要访问的网址def start_requests(self):for uid in uid_lists:# 生成器,会访问self.parse_urls函数yield Request(self.user_urls.format(uid=uid), callback=self.parse_user)def parse_user(self, response):res = json.loads(response.body_as_unicode())# 判断api接口返回成功与否if res['ok']:# 创建item对象user_item = UserItem()# 对页面信息进行解析user_info = res.get('data').get('userInfo')user_param = {'id':'id','screen_name':'screen_name','profile_image_url':'profile_image_url','profile_url':'profile_url','verified_reason':'verified_reason','close_blue_v':'close_blue_v','description':'description','gender':'gender','follow_me':'follow_me','following':'following','followers_count':'followers_count','follow_count':'follow_count','cover_image_phone':'cover_image_phone','avatar_hd':'avatar_hd'}for k,v in user_param.items():user_item[k] = user_info.get(v)# 返回item,用户数据保存yield user_item# 关注人信息 ,Request会发送一个请求,第一个参数为请求url,第二个参数为执行的回调函数,第三个参数为要传递的值,在回调函数中可以通过response.meta来获取.yield Request(self.followers_urls.format(uid = user_item.get('id'),page=1),callback=self.parse_follower,meta={'uid':user_item.get('id'),'page':1})# 粉丝信息yield Request(self.fans_urls.format(uid=user_item.get('id'), since_id=1),callback=self.parse_fans,meta={'uid': user_item.get('id'), 'since_id': 1})

获取该用户关注人信息

    def parse_follower(self,response):# 解析用户关注信息res = json.loads(response.text)if res['ok']:card_group =  res['data']['cards'][-1]['card_group']for card_info in card_group:user_info = card_info['user']# 得到该用户的iduid = user_info['id']print(user_info)# 对该用户的全部信息进行录入yield Request(self.user_urls.format(uid=uid), callback=self.parse_user)# 解析用户和关注人信息之间的关系follow_list = []for follow in card_group:follow_list.append({'id':follow['user']['id'],'name':follow['user']['screen_name']})uid = response.meta.get('uid')# 创建关注人和之前爬取用户的关联关系user_relation = UserRelationItem()user_relation['id'] = uiduser_relation['fans'] = []user_relation['follower'] = follow_listyield user_relation# 获取下一页的关注信息uid = response.meta.get('uid')page = int(response.meta.get('page')) + 1yield Request(self.followers_urls.format(uid=uid, page=page), callback=self.parse_follower,meta={'uid':uid,'page':page})

items.py页面

class UserItem(scrapy.Item):collections = 'user_info'# define the fields for your item here like:# name = scrapy.Field()id = scrapy.Field()screen_name = scrapy.Field()profile_image_url = scrapy.Field()profile_url = scrapy.Field()verified_reason = scrapy.Field()close_blue_v = scrapy.Field()description = scrapy.Field()gender = scrapy.Field()follow_me = scrapy.Field()following = scrapy.Field()followers_count = scrapy.Field()follow_count = scrapy.Field()cover_image_phone = scrapy.Field()avatar_hd = scrapy.Field()create_time = scrapy.Field()class UserRelationItem(scrapy.Item):collections = 'user'id =scrapy.Field()fans = scrapy.Field()follower = scrapy.Field()

pipelines.py页面,数据持久化操作

import pymongo
from datetime import datetime
from weibospider.items import UserItem, UserRelationItem# 对传入的item对象增加create_time属性
class UserCreateTimePipeline(object):def process_item(self,item,spider):if isinstance(item,UserItem):item['create_time'] = datetime.now().strftime('%Y-%m-%d %H:%M')return itemclass WeibospiderPipeline(object):def process_item(self, item, spider):return itemclass WeiboPymongoPipeline(object):# 用于保存item数据def __init__(self):conn = pymongo.MongoClient(host='127.0.0.1',port=27017)db = conn['day07_weibo']self.collection = db[UserItem.collections]def process_item(self, item, spider):# 进行判断,如果传入的是用户的信息,进行数据持久化if isinstance(item,UserItem):self.collection.update({'id':item['id']},{'$set':dict(item)},True)# 判断,如果是该用户粉丝或关注者的信息,则添加到该用户的粉丝或关注者的字段中if isinstance(item,UserRelationItem):self.collection.update({'id':item['id']},{'$addToSet':{'fans':{'$each':item['fans']},'follower':{'$each':item['follower']}}})

middlewares.py 设置请求头和IP池

import random
from scrapy.conf import settings
from scrapy.contrib.downloadermiddleware.useragent import UserAgentMiddlewareclass RandomUserAgent(UserAgentMiddleware):def process_request(self, request, spider):random.choice(settings['USER_AGENT_LIST'])request.headers.setdefault(b'User-Agent', self.user_agent)class RandomProxy(object):def process_request(self, request, spider):random_proxy = random.choice(settings['PROXY'])request.meta['proxy'] = 'http://%s' %  random_proxy在setting.py中
DOWNLOADER_MIDDLEWARES = {# 'weibospider.middlewares.WeibospiderDownloaderMiddleware': 543,'weibospider.middlewares.RandomUserAgent': 543,'weibospider.middlewares.RandomProxy': 544,
}

用Scrapy爬取新浪微博用户信息,粉丝,关注数相关推荐

  1. [Python 爬虫] 使用 Scrapy 爬取新浪微博用户信息(四) —— 应对反爬技术(选取 User-Agent、添加 IP代理池以及Cookies池 )

    上一篇:[Python 爬虫] 使用 Scrapy 爬取新浪微博用户信息(三) -- 数据的持久化--使用MongoDB存储爬取的数据 最近项目有些忙,很多需求紧急上线,所以一直没能完善< 使用 ...

  2. [Python 爬虫] 使用 Scrapy 爬取新浪微博用户信息(二) —— 编写一个基本的 Spider 爬取微博用户信息

    上一篇:[Python 爬虫] 使用 Scrapy 爬取新浪微博用户信息(一) -- 新建爬虫项目 在上一篇我们新建了一个 sina_scrapy 的项目,这一节我们开始正式编写爬虫的代码. 选择目标 ...

  3. [Python 爬虫] 使用 Scrapy 爬取新浪微博用户信息(三) —— 数据的持久化——使用MongoDB存储爬取的数据

    上一篇:[Python 爬虫] 使用 Scrapy 爬取新浪微博用户信息(二) -- 编写一个基本的 Spider 爬取微博用户信息 在上一篇博客中,我们已经新建了一个爬虫应用,并简单实现了爬取一位微 ...

  4. Scrapy爬取新浪微博用户信息、用户微博及其微博评论转发

    项目介绍 新浪微博是国内主要的社交舆论平台,对社交媒体中的数据进行采集是舆论分析的方法之一. 本项目无需cookie,可以连续爬取一个或多个新浪微博用户信息.用户微博及其微博评论转发. 实例 选择爬取 ...

  5. Scrapy爬取新浪微博用户粉丝数据

    一般来说pc端的信息是最为全面的,但是防范措施也是最严格的.所以不能走weibo.com这个域名下进行爬取,新浪微博在pc端的反扒措施较为全面.而手机端的数据则相对好爬取,而且数据都是Json格式,解 ...

  6. 爬取新浪微博用户信息及微博内容并进行可视化分析

    参考博文:https://blog.csdn.net/asher117/article/details/82793091 主要代码如下图 from selenium import webdriver ...

  7. 爬虫(8)-Scrapy爬取微博用户粉丝,关注和微博内容

    本文主要讲解使用scrapy爬取微博用户的关注,粉丝和微博内容. 认为有用的话请点赞,码字不易,谢谢. 其他爬虫实战请查看:https://blog.csdn.net/qq_42754919/cate ...

  8. 基于golang的爬虫demo,爬取微博用户的粉丝和关注者信息

    基于golang的爬虫demo,爬取微博用户的粉丝和关注者信息 注意:仅供学习交流,任何非法使用与作者无关! 目录 基于golang的爬虫demo,爬取微博用户的粉丝和关注者信息 一.背景与取材 二. ...

  9. python爬取微博用户信息(六)—— 完整代码

    本节为爬取微博用户信息的完整代码,以及项目结构. 感兴趣的小伙伴可以收藏哦! 另外,关于本代码的效果展示,以及教程,点击以下链接即可. python爬取微博用户信息(一)-- 效果展示 python爬 ...

最新文章

  1. .NET中获取电脑名,IP地址,当前用户
  2. 学习动态性能表(3)--v$sqlv$sql_plan
  3. Java迭代器Iterator
  4. SAP Fiori Elements里的SAP自定义注解annotation sap-text
  5. python 多个列表合并_Python实现合并两个列表的方法分析
  6. 电平通讯速度_飞凌干货丨几种常见的电平转换电路分析及应用
  7. pyspark读取csv_手把手实现 PySpark 机器学习项目回归算法
  8. HDFS报错:there are 15871 missing blocks,the following files may be corrupted
  9. Ubuntu虚拟机及Petalinux开发平台安装
  10. python入门教程 非常详细-Python编程入门教程:从入门到高级,非常详细
  11. 共享办公室租赁,突出市场重围
  12. 2016-2017 ACM-ICPC, Egyptian Collegiate Programming Contest (ECPC 16) 题解
  13. 梦江湖获取服务器信息,一梦江湖4月10日更新了什么-一梦江湖4月10日更新内容一览_快吧手游...
  14. 机器人周志_关于机器人的日记
  15. ForkJoinPool线程池原理分析
  16. 微信中无法下载APP的解决办法
  17. 「数据结构」普林斯顿算法课第二周作业
  18. eclipse m2eclipse插件迁移到m2e插件
  19. c++计算数组的中值
  20. html、css 实现一个漂亮的表格

热门文章

  1. SpingBoot+ScheduledFuture 实现动态定时任务
  2. Axure RP8 出现 Your trial has ended,过期不能使用的解决方法
  3. excel不显示0_表格0值太多,看起来不够美观简洁,只需这么做1分钟将0值隐藏掉...
  4. sourceinsight4设置
  5. 3dmax多个版本软件的安装包以及安装教程
  6. Unauthorized
  7. glClearColor
  8. 关联规则可视化python语言_关联规则可视化 - 猪猪daxia的个人空间 - OSCHINA - 中文开源技术交流社区...
  9. 自媒体视频如何“伪原创”?九大技巧揭秘!
  10. XP系统下,如何设置成开机直接登陆,不用输入密码