Python爬虫入门【20】:掘金网全站用户爬虫 scrapy

获取全站用户,理论来说从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()
Python资源分享qun 784758214 ,内有安装包,PDF,学习视频,这里是Python学习者的聚集地,零基础,进阶,都欢迎

编写爬虫主入口文件 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)
Python资源分享qun 784758214 ,内有安装包,PDF,学习视频,这里是Python学习者的聚集地,零基础,进阶,都欢迎

所有的代码都已经写完啦

全站用户爬虫编写完毕

扩展方向

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

原文地址:https://blog.51cto.com/14445003/2424143

时间: 2024-08-04 14:18:12

Python爬虫入门【20】:掘金网全站用户爬虫 scrapy的相关文章

Python爬虫入门【21】: 知乎网全站用户爬虫 scrapy

全站爬虫有时候做起来其实比较容易,因为规则相对容易建立起来,只需要做好反爬就可以了,今天咱们爬取知乎.继续使用scrapy当然对于这个小需求来说,使用scrapy确实用了牛刀,不过毕竟这个系列到这个阶段需要不断使用scrapy进行过度,so,我写了一会就写完了. 你第一步找一个爬取种子,算作爬虫入口 https://www.zhihu.com/people/zhang-jia-wei/following 我们需要的信息如下,所有的框图都是我们需要的信息. 获取用户关注名单 通过如下代码获取网页返

爬虫入门实战,知乎小爬虫

相比于爬虫框架,知乎小爬虫,更加适合初学者,尤其是想要了解爬虫技术细节.实现自己编写爬虫需求的初学者. 1. 谈爬虫工程师的价值 大数据时代已到,数据越来越具有价值了,没有数据寸步难行,有了数据好好利用,可以在诸多领域干很多事,比如很火的互联网金融.从互联网上爬来自己想要的数据,是数据的一个重要来源,而且往往是必不可少的来源.所有,目前,爬虫工程师是一个非常吃香的职位,工资往往都不低,就是要耐得住寂寞了.那爬虫工程师的价值也就是能稳定的.高效的和实时的带来数据.这里推荐看两篇文章: http:/

python爬虫入门(5)----- 阿里巴巴供应商爬虫

阿里巴巴供应商爬虫 起因 学了爬虫入门之后,打算找一个有难度的网站来实践,一开始打算找淘宝或者天猫(业界老大)来实践,但后续发现网上已经有很多这方面的项目,于是瞄上了阿里的国际网站阿里巴巴.开始一切顺利,没发现什么难度,后面发现供应商的联系方式需要登录,于是以其为目标开始写爬虫. 网站结构 1.阿里巴巴有个供应商分类的页面 https://www.alibaba.com/companies 2.点进去之后有个二级分类 3.再点进去就可以找到这个分类下的所有供应商 4.再进去就可以找供应商的联系方

python: 知乎大规模(34k)用户爬虫

前些天学习python,完成了python练习册的大部分习题:https://github.com/Show-Me-the-Code/python(我的github上有习题代码,欢迎自取).之后看到@salamer的一个python爬虫项目,觉得很不错.于是自己花了4天的时间完成了一个大规模爬取知乎用户信息的爬虫,由于个人网络原因,爬取12小时,获得了34k用户的信息(理论上可以爬全站的信息,可能时间要长一些,最好放在服务器上跑)并整理成直观的图表(文章末尾显示). 好了,说一下主要的技术点:

python爬虫入门(四)利用多线程爬虫

多线程爬虫 先回顾前面学过的一些知识 1.一个cpu一次只能执行一个任务,多个cpu同时可以执行多个任务2.一个cpu一次只能执行一个进程,其它进程处于非运行状态3.进程里包含的执行单元叫线程,一个进程可以包含多个线程4.一个进程的内存空间是共享的,每个进程里的线程都可以使用这个共享空间5.一个线程在使用这个共享空间的时候,其它的线程必须等待(阻塞状态)6.互斥锁作用就是防止多个线程同时使用这块内存空间,先使用的线程会将空间上锁,其它的线程处于等待状态.等锁开了才能进7.进程:表示程序的一次执行

网络爬虫入门:你的第一个爬虫项目(requests库)

0.采用requests库 虽然urllib库应用也很广泛,而且作为Python自带的库无需安装,但是大部分的现在python爬虫都应用requests库来处理复杂的http请求.requests库语法上简洁明了,使用上简单易懂,而且正逐步成为大多数网络爬取的标准. 1. requests库的安装采用pip安装方式,在cmd界面输入: pip install requests 小编推荐一个学python的学习qun 491308659 验证码:南烛无论你是大牛还是小白,是想转行还是想入行都可以来

(原)爬取辽宁科技大学相关新闻---python爬虫入门

有人说大部分python程序员都是通过爬虫入门的或者都是由爬虫喜欢上python的.还有大部分人学爬虫都喜欢拿自己学校的网站练手.我就是基于以上两点开始的... ok,开始,首先你需要一点python基础,一点点基础就可以,找一本薄薄的书过一遍,可以上这来找找 http://wiki.woodpecker.org.cn/moin/PyBooks 看书不爽,那你上这来看看,几道简简单单的题做过之后,顿觉一览众山小 http://www.pythontutor.com/ 咱们不是一边学爬虫,一边学p

Python简单爬虫入门二

接着上一次爬虫我们继续研究BeautifulSoup Python简单爬虫入门一 上一次我们爬虫我们已经成功的爬下了网页的源代码,那么这一次我们将继续来写怎么抓去具体想要的元素 首先回顾以下我们BeautifulSoup的基本结构如下 #!/usr/bin/env python # -*-coding:utf-8 -*- from bs4 import BeautifulSoup import requests headers = { 'User-Agent':'Mozilla/5.0 (Win

python爬虫入门练习,使用正则表达式和requests爬取LOL官网皮肤

刚刚python入门,学会了requests模块爬取简单网页,然后写了个爬取LOL官网皮肤的爬虫,代码奉上 #获取json文件#获取英雄ID列表#拼接URL#下载皮肤 #导入re requests模块 import requestsimport reimport time def Download_LOL_Skin(): #英雄信息Json文件地址:https://lol.qq.com/biz/hero/champion.js #获取英雄信息列表 json_url = "https://lol.