爬前叨叨

已经编写了33篇爬虫文章了,如果你按着一个个的实现,你的爬虫技术已经入门,从今天开始慢慢的就要写一些有分析价值的数据了,今天我选了一个《掘金网》,我们去爬取一下他的全站用户数据。

爬取思路

获取全站用户,理论来说从1个用户作为切入点就可以,我们需要爬取用户的关注列表,从关注列表不断的叠加下去。

随便打开一个用户的个人中心

绿色圆圈里面的都是我们想要采集到的信息。这个用户关注0人?那么你还需要继续找一个入口,这个用户一定要关注了别人。选择关注列表,是为了让数据有价值,因为关注者里面可能大量的小号或者不活跃的账号,价值不大。

我选了这样一个入口页面,它关注了3个人,你也可以选择多一些的,这个没有太大影响!

https://juejin.im/user/55fa7cd460b2e36621f07dde/following

我们要通过这个页面,去抓取用户的ID

得到ID之后,你才可以拼接出来下面的链接

https://juejin.im/user/用户ID/following

爬虫编写

分析好了之后,就可以创建一个scrapy项目了

items.py 文件,用来限定我们需要的所有数据,注意到下面有个_id = scrapy.Field() 这个先预留好,是为了mongdb准备的,其他的字段解释请参照注释即可。

class JuejinItem(scrapy.Item):

    _id = scrapy.Field()
username = scrapy.Field()
job = scrapy.Field()
company =scrapy.Field()
intro = scrapy.Field()
# 专栏
columns = scrapy.Field()
# 沸点
boiling = scrapy.Field()
# 分享
shares = scrapy.Field()
# 赞
praises = scrapy.Field()
#
books = scrapy.Field()
# 关注了
follow = scrapy.Field()
# 关注者
followers = scrapy.Field()
goods = scrapy.Field()
editer = scrapy.Field()
reads = scrapy.Field()
collections = scrapy.Field()
tags = scrapy.Field()

编写爬虫主入口文件 JuejinspiderSpider.py

import scrapy
from scrapy.selector import Selector
from Juejin.items import JuejinItem class JuejinspiderSpider(scrapy.Spider):
name = 'JuejinSpider'
allowed_domains = ['juejin.im']
# 起始URL 5c0f372b5188255301746103
start_urls = ['https://juejin.im/user/55fa7cd460b2e36621f07dde/following']

def parse 函数,逻辑不复杂,处理两个业务即可

  1. 返回item
  2. 返回关注列表的Request

item的获取,我们需要使用xpath匹配即可,为了简化代码量,我编写了一个提取方法,叫做get_default函数。

    def get_default(self,exts):
if len(exts)>0:
ret = exts[0]
else:
ret = 0
return ret def parse(self, response):
#base_data = response.body_as_unicode()
select = Selector(response)
item = JuejinItem()
# 这个地方获取一下数据
item["username"] = select.xpath("//h1[@class='username']/text()").extract()[0]
position = select.xpath("//div[@class='position']/span/span/text()").extract()
if position:
job = position[0]
if len(position)>1:
company = position[1]
else:
company = ""
else:
job = company = ""
item["job"] = job
item["company"] = company
item["intro"] = self.get_default(select.xpath("//div[@class='intro']/span/text()").extract())
# 专栏
item["columns"] = self.get_default(select.xpath("//div[@class='header-content']/a[2]/div[2]/text()").extract())
# 沸点
item["boiling"] = self.get_default(select.xpath("//div[@class='header-content']/a[3]/div[2]/text()").extract())
# 分享
item["shares"] = self.get_default(select.xpath("//div[@class='header-content']/a[4]/div[2]/text()").extract())
# 赞
item["praises"] = self.get_default(select.xpath("//div[@class='header-content']/a[5]/div[2]/text()").extract())
#
item["books"] = self.get_default(select.xpath("//div[@class='header-content']/a[6]/div[2]/text()").extract()) # 关注了
item["follow"] = self.get_default(select.xpath("//div[@class='follow-block block shadow']/a[1]/div[2]/text()").extract())
# 关注者
item["followers"] = self.get_default(select.xpath("//div[@class='follow-block block shadow']/a[2]/div[2]/text()").extract()) right = select.xpath("//div[@class='stat-block block shadow']/div[2]/div").extract()
if len(right) == 3:
item["editer"] = self.get_default(select.xpath("//div[@class='stat-block block shadow']/div[2]/div[1]/span/text()").extract())
item["goods"] = self.get_default(select.xpath("//div[@class='stat-block block shadow']/div[2]/div[2]/span/span/text()").extract())
item["reads"] = self.get_default(select.xpath("//div[@class='stat-block block shadow']/div[2]/div[3]/span/span/text()").extract()) else:
item["editer"] = ""
item["goods"] = self.get_default(select.xpath("//div[@class='stat-block block shadow']/div[2]/div[1]/span/span/text()").extract())
item["reads"] = self.get_default(select.xpath("//div[@class='stat-block block shadow']/div[2]/div[2]/span/span/text()").extract()) item["collections"] = self.get_default(select.xpath("//div[@class='more-block block']/a[1]/div[2]/text()").extract())
item["tags"] = self.get_default(select.xpath("//div[@class='more-block block']/a[2]/div[2]/text()").extract())
yield item # 返回item

上述代码,已经成功返回了item,打开setting.py文件中的pipelines设置,测试一下是否可以存储数据,顺便在

DEFAULT_REQUEST_HEADERS 配置一下request的请求参数。

setting.py

DEFAULT_REQUEST_HEADERS = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language': 'en',
"Host": "juejin.im",
"Referer": "https://juejin.im/timeline?sort=weeklyHottest",
"Upgrade-Insecure-Requests": "1",
"User-Agent": "Mozilla/5.0 浏览器UA"
} ITEM_PIPELINES = {
'Juejin.pipelines.JuejinPipeline': 20,
}

本爬虫数据存储到mongodb里面,所以需要你在pipelines.py文件编写存储代码。


import time
import pymongo 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.jujin # 准备插入数据 class JuejinPipeline(object): def process_item(self, item, spider):
try:
collection.insert(item)
except Exception as e:
print(e.args)

运行代码之后,如果没有报错,完善最后一步即可,在Spider里面将爬虫的循环操作完成

      list_li = select.xpath("//ul[@class='tag-list']/li")  # 获取所有的关注
for li in list_li:
a_link = li.xpath(".//meta[@itemprop='url']/@content").extract()[0] # 获取URL
# 返回拼接好的数据请求
yield scrapy.Request(a_link+"/following",callback=self.parse)

所有的代码都已经写完啦

全站用户爬虫编写完毕,厉害吧。

扩展方向

  1. 爬虫每次只爬取关注列表的第一页,也可以循环下去,这个不麻烦
  2. 在setting.py中开启多线程操作
  3. 添加redis速度更快,后面会陆续的写几篇分布式爬虫,提高爬取速度
  4. 思路可以扩展,N多网站的用户爬虫,咱后面也写几个

Python爬虫入门教程 34-100 掘金网全站用户爬虫 scrapy的更多相关文章

  1. Python爬虫入门教程 35-100 知乎网全站用户爬虫 scrapy

    爬前叨叨 全站爬虫有时候做起来其实比较容易,因为规则相对容易建立起来,只需要做好反爬就可以了,今天咱们爬取知乎.继续使用scrapy当然对于这个小需求来说,使用scrapy确实用了牛刀,不过毕竟本博客 ...

  2. Python爬虫入门教程 36-100 酷安网全站应用爬虫 scrapy

    爬前叨叨 2018年就要结束了,还有4天,就要开始写2019年的教程了,没啥感动的,一年就这么过去了,今天要爬取一个网站叫做酷安,是一个应用商店,大家可以尝试从手机APP爬取,不过爬取APP的博客,我 ...

  3. Python爬虫入门教程 43-100 百思不得姐APP数据-手机APP爬虫部分

    1. Python爬虫入门教程 爬取背景 2019年1月10日深夜,打开了百思不得姐APP,想了一下是否可以爬呢?不自觉的安装到了夜神模拟器里面.这个APP还是比较有名和有意思的. 下面是百思不得姐的 ...

  4. Python爬虫入门教程 4-100 美空网未登录图片爬取

    美空网未登录图片----简介 上一篇写的时间有点长了,接下来继续把美空网的爬虫写完,这套教程中编写的爬虫在实际的工作中可能并不能给你增加多少有价值的技术点,因为它只是一套入门的教程,老鸟你自动绕过就可 ...

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

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

  6. Python爬虫入门教程 10-100 图虫网多线程爬取

    图虫网-写在前面 经历了一顿噼里啪啦的操作之后,终于我把博客写到了第10篇,后面,慢慢的会涉及到更多的爬虫模块,有人问scrapy 啥时候开始用,这个我预计要在30篇以后了吧,后面的套路依旧慢节奏的, ...

  7. Python爬虫入门教程 18-100 煎蛋网XXOO图片抓取

    写在前面 很高兴我这系列的文章写道第18篇了,今天写一个爬虫爱好者特别喜欢的网站煎蛋网http://jandan.net/ooxx,这个网站其实还是有点意思的,网站很多人写了N多的教程了,各种方式的都 ...

  8. Python爬虫入门教程 31-100 36氪(36kr)数据抓取 scrapy

    1. 36氪(36kr)数据----写在前面 今天抓取一个新闻媒体,36kr的文章内容,也是为后面的数据分析做相应的准备的,预计在12月底,爬虫大概写到50篇案例的时刻,将会迎来一个新的内容,系统的数 ...

  9. Python爬虫入门教程 30-100 高考派大学数据抓取 scrapy

    1. 高考派大学数据----写在前面 终于写到了scrapy爬虫框架了,这个框架可以说是python爬虫框架里面出镜率最高的一个了,我们接下来重点研究一下它的使用规则. 安装过程自己百度一下,就能找到 ...

随机推荐

  1. 将Map中的参数封装为XML

    public String packageYDImageUploadXML(String versionCode, Map parmsMap) throws ParseException { Docu ...

  2. MySQL 如何使用左链接代替 NOT IN

    核心思想 通过左链接 查询出要排除的数据 然后和主表进行匹配 拿去未匹配到的数据 可以使用 IS NULL 来过滤掉 案例稍后 更新 select * from a left join on a.id ...

  3. JavaScript遍历对象4种方法和遍历数组的3种方式 代码

    //遍历对象 4种方法 //Object.keys(obj).forEach() console.log("keys...遍历</br>") var obj1 = { ...

  4. vijos搭建踩坑

    nodejs我用的8.x版本,可以工作. 和制作组交谈之后他们说最好榨汁机和主机不要在同一系统下. vj4/vj4/handler/base.py的第343行 从 super(Connection, ...

  5. It is difficult to the point of impossiblity for sb to image a time when ...

    对sb而言很难想象一段..的时光.

  6. TCP(控制传输协议)详解

    1.传输层概述 在OSI参考模型中,网络层是面向通信的最高层但同时也是面向用户程序的最底层. 传输层的主要作用: 复用:在发送端,多个应用程序公用一个传输层: 分用:在接收端,传输层把从网络层接收到的 ...

  7. 配置Https 和 HSTS

    1. 视频 https://www.bilibili.com/video/av33344382/?p=2 using System; using Microsoft.AspNetCore.Builde ...

  8. 初入linux系统

    作为微软的老铁粉了,看到微软进军linux这么久了,是时候该跟上脚本了,不然该落后了,脚步是如此之快,着实让我吃了一惊,说干就干, 绝不是开玩笑的,谁也阻止不了.net开源,跨平台的脚步了.以前别人说 ...

  9. 11、js 数组详细操作方法及解析合集

    js 数组详细操作方法及解析合集 前言 在开发中,数组的使用场景非常多,平日中也涉及到很多数组的api/相关操作,一直也没有对这块内容进行一块整理总结,很多时候就算用过几次这个api,在开发中也很容易 ...

  10. 东软实习<3>

    今天学习过程和小节 主要对多线程,单例模式以及jdbc进行了一些深入着重的学习, 还有就是学习了如何使用java操作HDFS 主要是对于一些继承调用的使用等 1.封装JDBC,自定义范型 2.反射,自 ...