1 前言

   要说到爬虫界的明星,当属我们的python,而这得益于我们的爬虫明星框架--scrapy,这就让我们不得不学习它,这几天刚好用它做一些小demo,就将其总结一下,希望能对大家的学习爬虫有所帮助。
   这次要爬取的是我们IT界挺有名的技术文章网站--伯乐在线的所有文章,并解析文章详情,本文适合有一定爬虫基础的同学(用过requests库,urllib库之类的)
    本人的github地址:https://github.com/oldbig-carry/jobbole_spider
欢迎fork,和star哦

2 Scrapy框架之初窥门径

2.1 Scrapy简介

Scrapy Engine(Scrapy核心) 负责数据流在各个组件之间的流。Spiders(爬虫)发出Requests请求,经由Scrapy Engine(Scrapy核心) 交给Scheduler(调度器),Downloader(下载器)Scheduler(调度器) 获得Requests请求,然后根据Requests请求,从网络下载数据。Downloader(下载器)的Responses响应再传递给Spiders进行分析。根据需求提取出Items,交给Item Pipeline进行下载。Spiders和Item Pipeline是需要用户根据响应的需求进行编写的。除此之外,还有两个中间件,Downloaders Mddlewares和Spider Middlewares,这两个中间件为用户提供方面,通过插入自定义代码扩展Scrapy的功能,例如去重等。因为中间件属于高级应用,本次教程不涉及,因此不做过多讲解。

2.2 Scrapy基础

安装好Scrapy之后,我们就可以开启我们的Scrapy之旅了。官方的详细中文教程,请参见:http://scrapy-chs.readthedocs.io/zh_CN/0.24/intro/tutorial.html 。我这里只讲本次实战用到的知识。

简单流程如下:

  • 创建一个Scrapy项目;
  • 定义提取的Item;
  • 编写爬取网站的 spider 并提取 Item;
  • 编写 Item Pipeline 来存储提取到的Item(即数据)。

2.2.1 创建项目

在开始爬取之前,我们必须创建一个新的Scrapy项目。 进入打算存储代码的目录中,运行下列命令:

scrapy startproject cartoon

该命令将会创建包含下列内容的cartoon目录:

cartoon/scrapy.cfgcartoon/__init__.pyitems.pymiddlewares.pypipelines.pysettings.pyspiders/__init__.py...
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

这些文件分别是:

  • scrapy.cfg: 项目的配置文件;
  • cartoon/: 该项目的python模块。之后将在此加入Spider代码;
  • cartoon/items.py: 项目中的item文件;
  • cartoon/middlewares .py:项目中的中间件;
  • cartoon/pipelines.py: 项目中的pipelines文件;
  • cartoon/settings.py: 项目的设置文件;
  • cartoon/spiders/: 放置spider代码的目录

2.2.2 创建项目模板

在cmd中cd进入创建好的项目目录,然后输入 scrapy genspider jobbole blog.jobbole.com  创建伯乐文章目录的基本模板

2.2.3 使你的scrapy项目变得可调式

scrapy中有内置调试模块,可以高效率的调试scrapy程序,首先在工程目录下创建main.py文件,
然后输入

from scrapy.cmdline import execute
import sys
import osprint(os.path.abspath(__file__))   #获取main.py的路径
sys.path.append(os.path.dirname(os.path.abspath(__file__)))  #通过main获取父路径即项目路径
execute(["scrapy","crawl","jobbole"])   #执行scrapy脚本

现在可以通过运行main.py文件来运行项目了

2.3 xpath基础

看下下面的两个图基本能入门了

2.3 css选择器基础

3.1 Shell分析

在编写程序之前,我们可以使用Scrapy内置的Scrapy shell,分析下目标网页,伯乐在线的文章有一个专门的网址可以看到,http://blog.jobbole.com/all-posts/ ,首先在cmd中输入:

scrapy shell "http://blog.jobbole.com/all-posts/"

然后分析网站,右击文章的标题,

文章标题在

archive id中 -> floated-thumb类 ->post-thumb类 ->a标签 ->属性href中

输入

response.css("#archive .floated-thumb .post-thumb a ::attr(href)").extract()

输出

为第一页所有文章的目录

接下来解析爬取到的文章,首先要导入  scrapy的request类

from scrapy.http import Request

先定义文章详情类,来解析文章详情页

    def parse_detail(self,response):pass

下面通过yield 来回调文章详情页

首先导入parse类

from urllib import parse

通过parse类来拼接url(伯乐在线的文章url是完整的,所以也可以不用拼接,但是很多网站的url都是不完整的,所以学习这个技术挺重要的)

        for post_url in post_urls:yield Request(url=parse.urljoin(response.url,post_url),callback=self.parse_detail)

接下来要获取下一页的文章

右击下一页点击检查
下一页的url在如图,通过css选择器
response.css(".next.page-numbers::attr(href)").extract_first("")
其中的

.next.page-numbers  两个类之间没有空格,就是因为两个类为同一目录,如果有层次关系,则应该加上空格
这样就取到了了下一页的url,然后在回调得到下一页所有文章的url
yield Request(url=parse.urljoin(response.url, next_url), callback=self.parse)

这样就能提取所有文章

代码:
# -*- coding: utf-8 -*-
import scrapy
import re
from urllib import parse
from scrapy.http import Requestclass JobboleSpider(scrapy.Spider):name = 'jobbole'allowed_domains = ['blog.jobbole.com']start_urls = ['http://blog.jobbole.com/all-posts/']def parse(self, response):#解析列表页的所有文章并交给scrapy下载后进行解析post_nodes = response.css("#archive .floated-thumb .post-thumb a")for post_node in post_nodes:post_url = post_node.css("::attr(href)").extract_first("")yield Request(url=parse.urljoin(response.url,post_url), callback=self.parse_detail)next_url = response.css(".next.page-numbers::attr(href)").extract_first("")if next_url:yield Request(url=parse.urljoin(response.url, next_url), callback=self.parse)def parse_detail(self,response):pass

运行结果:

这样就能异步爬取所有文章的url,接下来编写 我们的items.py也就是我们的实体类,里面包含我们文章的详情解析,
包括我们文章的title  创建时间  评论人数等等,视你的业务要求而定
我的items.py文件如下:
import scrapy
class ArticlespiderItem(scrapy.Item):# define the fields for your item here like:# name = scrapy.Field()title = scrapy.Field()create_date = scrapy.Field()url = scrapy.Field()url_object_id = scrapy.Field()front_image_url = scrapy.Field()front_image_path = scrapy.Field()praise_nums = scrapy.Field()fav_nums = scrapy.Field()comment_nums = scrapy.Field()tags = scrapy.Field()content = scrapy.Field()
这里首先在cmd中输入 ctrl+c退出当前测试shell,输入   
scrapy shell "http://blog.jobbole.com/112473/"
观察文章标题的css排版,在entry-header类下面的h1标签的text

然后输入

response.css(".entry-header h1::text").extract()[0]


这样就取出文章的标题,接下来可以按你的喜好选择

编写后的文章细节类如下(放在spiders里):
def parse_detail(self,response):article_item = ArticlespiderItem()   #对应你的items实体类title = response.css(".entry-header h1::text").extract()[0]   #获取文章标题article_item["title"] = title   yield article_item    #回调进入pipelines进行数据的存储

这样就能进行我们的数据存储了,编写我们的pipelines.py,创建一个接收json数据的类JsonWithEncodingPipeline 通过codecs类来打开存储文件

codecs.open('article.json', 'w', encoding="utf-8")

process_item 函数为我们处理item的函数,也就是回调item的最终去向,通过json的dumps方法来解析item,其中第一个参数必须是dict,解析编码必须设置ensure_ascii=False,否则中文解析会乱码,最后将json数据写入文件就行了,代码如下:

import json
import codecsclass ArticlespiderPipeline(object):def process_item(self, item, spider):return itemclass JsonWithEncodingPipeline(object):#自定义json文件的导出def __init__(self):self.file = codecs.open('article.json', 'w', encoding="utf-8")def process_item(self, item, spider):lines = json.dumps(dict(item), ensure_ascii=False) + "\n"self.file.write(lines)return itemdef spider_closed(self, spider):self.file.close()

接下来只要设置一个setting.py,规定一下item的处理类,也就是我们刚刚编写的类,在setting.py中找到
ITEM_PIPELINES 将其注解前缀去掉(快捷键:ctrl+/),然后输入刚刚编写的pipilines路径,代码,如下

ITEM_PIPELINES = {'ArticleSpider.pipelines.JsonWithEncodingPipeline': 2,
}
后面的数字越小执行的顺序越前

这样就大功告成啦,在main.py点击run,可以看到运行结果如下:

它会给我们创建一个article.json文件,里面是我们每篇文章的数据,如果运行成功的话,结果就会出来啦,哈哈哈,终于大功告成啦。

其中item数据我是爬取了文章的标题,url,内容等,看你需要爬取,基本都一个样我就不一一列举啦

3.总结

这次爬取过程中遇到了挺多大大小小的问题,其中在爬取文章的图片时卡住了很久,最后终于爬出来了(在上述的运行结果又显示),其中也学到了挺多小技巧,也让我明白,测试很重要,特别是写正则表达式或者xpath,css路径时,很难一次成功,就必须在cmd中快速测试才行

这次代码量有点多,如果大家一步步按着来做还是运行不出可以在我的github上下载:

https://github.com/oldbig-carry/jobbole_spider

其中我添加了文章图片的下载,运行结果如图:

还有一些文章的评论数,标签等也进行了爬取

最后最后各位大佬,可以的话给个star哦,感激不尽

scrapy初始第一波——爬取伯乐在线所有文章相关推荐

  1. scrapy简单入门 - 爬取伯乐在线所有文章

    推荐我的个人博客 http://blog.wuzhenyu.com.cn scrapy 是一个用 python 语言编写的,为了爬取网站数据,提取结构性数据而编写的应用框架. 环境 本文使用的环境: ...

  2. Scrapy爬取伯乐在线所有文章

    Scrapy爬取伯乐在线所有文章 1.目标分析 2.Spiders的编写 2.1.网站结构分析 2.2.获取当页文章URL 2.3.获取文章的信息 2.4.文章列表下一页 2.4.编写spiders. ...

  3. Python scrapy爬虫爬取伯乐在线全部文章,并写入数据库

    伯乐在线爬虫项目目的及项目准备: 1.使用scrapy创建项目 2.创建爬虫,bole 域名 jobbole.com 3.Start_urls = ['http://blog.jobbole.com/ ...

  4. scrapy入门:爬取伯乐在线

    一.创建项目 在开始爬取之前,您必须创建一个新的Scrapy项目. 进入您打算存储代码的目录中,运行下列命令: scrapy startproject tutorial 删除时直接在直接在文件管理删除 ...

  5. scrapy 解析css,Scrapy基础(六)————Scrapy爬取伯乐在线一通过css和xpath解析文章字段...

    上次我们介绍了scrapy的安装和加入debug的main文件,这次重要介绍创建的爬虫的基本爬取有用信息 通过命令(这篇博文)创建了jobbole这个爬虫,并且生成了jobbole.py这个文件,又写 ...

  6. 边学边敲边记之爬虫系列(八):Scrapy系统爬取伯乐在线

    一.前言 上一篇边学边敲边记爬虫系列七给大家仔细讲解了如何用Xpath分类爬取医疗信息网站医疗器材名称和介绍图片,以及三种最常用的存储方法. 本篇是本系列的第八篇了,今天给大家讲讲如何用Scrapy分 ...

  7. 利用Scrapy爬取伯乐在线文章并存取到mysql数据库

    1.观察网址直接从(http://blog.jobbole.com/all-posts/)入手爬取伯乐在线所有文章,常规cmd创建项目 2.spider中采取xpath和css选择器提取语法,提取出想 ...

  8. Scrapy爬取伯乐在线的所有文章

    本篇文章将从搭建虚拟环境开始,爬取伯乐在线上的所有文章的数据. 搭建虚拟环境之前需要配置环境变量,该环境变量的变量值为虚拟环境的存放目录 1. 配置环境变量 2.创建虚拟环境 用mkvirtualen ...

  9. scrapy | 爬取伯乐在线全部博文(xpath/css/itemload三种提取方法,同步、异步方式存入MySQL)

    1.目标 伯乐在线网站地址:http://blog.jobbole.com/all-posts/ 爬取伯乐在线的所有文章信息,包括图片网址,标题,发表日期,标签,点赞数,评论数等 将爬取的数据保存至数 ...

最新文章

  1. 证照编号与所选择的主体类型不一致_你的孩子天天在用“化妆品”,如何不踩雷?...
  2. golang中的strings.ContainsAny
  3. POJ-2386-Lake Counting
  4. Silverlight3.0正式版(Silverlight3_Tools)离线安装手记
  5. 解开玻尔兹曼机的封印会发生什么?
  6. Navicat Premium 15 连接Oracle数据库解决方案
  7. Flex导出Excel
  8. Mac电脑下使用Socket报错socket抛出Can’t assign requested address解决
  9. Smart210使用superboot刷机
  10. 公众号淘客返利系统,自动回复淘宝优惠券实现方法
  11. HTTP Live Streaming (HLS) 协议科普扫盲
  12. vs2013创建WebService
  13. 事业单位考试计算机专业知识题库,计算机考试题库:计算机考试模拟练习题(201)...
  14. V 神打算让以太坊联姻 BCH 匿名币颤抖吗?
  15. Yolov5可以看到虽然有结果图片,但是并没有框出识别结果
  16. python中可选参数是什么意思_什么是python的必选参数
  17. 无法卸载 LiveUpdate Notice 的问题
  18. Git删除指定文件的所有记录和版本
  19. ElGamal算法加解密
  20. DEFI是什么,defi是什么模式?

热门文章

  1. 龙王传说古月_龙王传说第290话:古月沉浸在唐舞麟的温柔之中无法自拔!
  2. 发生系统错误 1219。不允许一个用户使用一个以上用户名与服务器或共享资源的多重连接。
  3. JavaScript经典进阶:javascript – 9宫格 – 拼图
  4. 微信小程序布局干货——来自微信官方
  5. USB接口Altium designer原理图PCB封装
  6. MacAppStore的魅力4点
  7. DOO-SABIN 细分正方体(1)利用邻接矩阵表示
  8. 蓝绿部署、滚动部署、灰度发布(金丝雀发布)
  9. 英雄联盟手游推荐耳机,南卡Lite Pro 2展现优秀游戏声效处理硬实力
  10. codeforces 314 (Div 1) 题解