刚接触Scrapy框架,不是很熟悉,之前用webdriver+selenium实现过头条的抓取,但是感觉对于整站抓取,之前的这种用无GUI的浏览器方式,效率不够高,所以尝试用CrawlSpider来实现。

这里通过一个实例加深对Scrapy框架的理解。

本文开发环境:

本文目标:抓取网站https://blog.scrapinghub.com的所有文章标题。

1.首页的布局分析

这个博客网站的页面结构如下图所示,我们的目标是抓取每页中间的item的标题,以及通过crawlspider自动抓取下一页的link链接达到自动抓取全站资源的目标。底部只有下一页的链接。

再来看第二页的布局:

中间的内容跟首页一样,只是在底部的分页导航,多了上一页(首页只有下一页)

所以,文章标题所在布局我们搞清楚了,分页导航的格式也十分简单:https://blog.scrapinghub.com/page/2,

只是最后一个数字不一样,这个数字就代表第几页文章。只是最后一个数字不一样,这个数字就代表第几页文章。

2.VSCode实现基于Scrapy框架的CrawlSpider爬虫

2.1 创建Scrapy工程

终端进入到D盘的tmp目录输入如下命令创建一个名字为blogscrapy的scrapy工程(官方文档:):

scrapy startproject blogscrapy

2.2 创建CrawlSpider爬虫

终端进入到 D:\tmp\blogscrapy,输入如下命令创建一个名为blogspider,允许爬虫的域名为scrapinghub.com的基于crawlSpider模板的spider爬虫(官方文档:):

scrapy genspider -t crawl blogspider blog.scrapinghub.com

2.3 定义item获取所需属性字段

items.py的内容如下:

# -*- coding: utf-8 -*-
import scrapy
class BlogscrapyItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
title = scrapy.Field()

2.3 修改spider定义抓取规则、存储字段

blog.py的内容如下:

# -*- coding: utf-8 -*-
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from blogscrapy.items import BlogscrapyItem class BlogSpider(CrawlSpider):
name = 'blog'
allowed_domains = ['blog.scrapinghub.com']
start_urls = ['http://blog.scrapinghub.com/'] rules = (
Rule(LinkExtractor(restrict_xpaths=('//div[@class="blog-pagination"]/a', )), callback='parse_item', follow=True),
) def parse_item(self, response):
for title in response.xpath('//div[@class="post-listing"]/div[@class="post-item"]/div[@class="post-header"]/h2'):
item = BlogscrapyItem()
item['title'] = title.xpath('./a/text()').extract_first()
yield item

pipeline.py的内容如下:

# -*- coding: utf-8 -*-

# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://doc.scrapy.org/en/latest/topics/item-pipeline.html import json class BlogscrapyPipeline(object): def __init__(self):
self.file = open('pipeline-result.json', 'a+', encoding='utf-8') def process_item(self, item, spider):
content = json.dumps(dict(item), ensure_ascii=False) + "\n"
self.file.write(content)
return item def close_spider(self, spider):
self.file.close()

最后,需要把pipeline的处理加到工程里面才能起作用,编辑工程目录下的settings.py文件,加入以下内容:

ITEM_PIPELINES = {
'blogscrapy.pipelines.BlogscrapyPipeline': 300,
}

3. 运行结果

上图看到成功爬取了12页内容,每页10条,总共115篇文章。

4. 本文源码下载

下载地址: 点我去下载


参考资料

[1]: Scrapy官方文档
[2]: Python3爬取今日头条系列

[3]: 廖雪峰老师的Python3 在线学习手册

[4]: Python3官方文档

[5]: 菜鸟学堂-Python3在线学习

[6]: XPath语法参考

Scrapy 使用CrawlSpider整站抓取文章内容实现的更多相关文章

  1. wget整站抓取、网站抓取功能;下载整个网站;下载网站到本地

    wget -r   -p -np -k -E  http://www.xxx.com 抓取整站 wget -l 1 -p -np -k       http://www.xxx.com 抓取第一级 - ...

  2. Scrapy爬虫入门系列4抓取豆瓣Top250电影数据

    豆瓣有些电影页面需要登录才能查看. 目录 [隐藏]  1 创建工程 2 定义Item 3 编写爬虫(Spider) 4 存储数据 5 配置文件 6 艺搜参考 创建工程 scrapy startproj ...

  3. Node.js 爬虫,自动化抓取文章标题和正文

    持续进行中... 目标: 动态User-Agent模拟浏览器 √ 支持Proxy设置,避免被服务器端拒绝 √ 支持多核模式,发挥多核CPU性能 √ 支持核内并发模式 √ 自动解码非英文站点,避免乱码出 ...

  4. 如何让搜索引擎抓取AJAX内容? 转

    越来越多的网站,开始采用"单页面结构"(Single-page application). 整个网站只有一张网页,采用 Ajax 技术,根据用户的输入,加载不同的内容. 这种做法的 ...

  5. 如何让搜索引擎抓取AJAX内容?

    越来越多的网站,开始采用"单页面结构"(Single-page application). 整个网站只有一张网页,采用Ajax技术,根据用户的输入,加载不同的内容. 这种做法的好处 ...

  6. Python抓取视频内容

    Python抓取视频内容 Python 是一种面向对象.解释型计算机程序设计语言,由Guido van Rossum于1989年底发明,第一个公开发行版发行于1991年.Python语法简洁而清晰,具 ...

  7. 【java】抓取页面内容,提取链接(此方法可以http get无需账号密码的请求)

    package 网络编程; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileOutpu ...

  8. 如何使用angularjs实现抓取页面内容

    <html ng-app="myApp"> <head> <title>angularjs-ajax</title> <scr ...

  9. 查询数据,从链接地址中爬取文章内容jsoup

    查询数据,从链接地址中爬取文章内容 protected void doGet(HttpServletRequest request, HttpServletResponse response) thr ...

随机推荐

  1. 微信小程序--代码构成---JS 交互逻辑

    一个服务仅仅只有界面展示是不够的,还需要和用户做交互:响应用户的点击.获取用户的位置等等.在小程序里边,我们就通过编写 JS 脚本文件来处理用户的操作. <view>{{ msg }}&l ...

  2. SQL Server索引误区使用建议

    常见的误区: 1.数据库不需要索引 2.主键总是聚集的 3.联机索引操作不引起阻塞 4.复合索引下列的顺序不重要 5.聚集索引以物理顺序存储 6.填充因子可以应用在索引的插入过程中 7.每个表应该有聚 ...

  3. 一脸懵逼加从入门到绝望学习hadoop之Caused by: java.net.UnknownHostException: master报错

    windows下开发hadoop应用程序,hadoop部署在linux环境中, 在运行调试时可能会出现无法找到主机,类似异常信息如下: java.net.UnknownHostException: u ...

  4. 彻底明确怎样设置minSdkVersion和targetSdkVersion

    minSdkVersion和targetSdkVersion相信非常多人都不太理解.我在网上也看了很多关于这两者差别的文章,感觉说的都非常模糊.直到我在stackOverFlow看到Android M ...

  5. 【Android】ScaleAnimation 详解

    ScaleAnimation类是Android系统中的尺寸变化动画类,用于控制View对象的尺寸变化,该类继承于Animation类.ScaleAnimation类中的很多方法都与Animation类 ...

  6. Python学习(十七)—— 数据库(二)

    转载自http://www.cnblogs.com/linhaifeng/articles/7356064.html 一. 数据库管理软件的由来 基于我们之前所学,数据要想永久保存,都是保存于文件中, ...

  7. Codeforces 387E George and Cards

    George and Cards 我们找到每个要被删的数字左边和右边第一个比它小的没被删的数字的位置.然后从小到大枚举要被删的数, 求答案. #include<bits/stdc++.h> ...

  8. iframe获取元素

    原生js在网页中,父元素获取iframe中的元素: window.onload=function () { 例如: console.log(window.frames["iframe的nam ...

  9. Excel ——多表关联查询-vlookup

    一.分组 需求: 在B列的右侧添加一列[消费分组]对B列的[月分组水平]进行分组,原始数据如下: 公式:在 C2 输入:“=VLOOKUP(B2,$E$1:$G$4,2,1)”,下拉填充. 提示:VL ...

  10. 01. Numpy模块

    1.科学计算工具-Numpy基础数据结构 1.1.数组ndarray的属性 NumPy数组是一个多维数组对象,称为ndarray.其由两部分组成:① 实际的数据② 描述这些数据的元数据 注意数组格式, ...