使用scarpy爬取文章并保存为json文本

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情
        scarpy是python爬虫界最著名的框架,最近使用了下确实很方便,其底层使用的Twisted使用异步非阻塞的方式速度是相当的快(比自己用requests快多了),这里介绍下使用scarpy框架爬取文章和图片,并进行二层爬取文章的内容,然后以dict形式保存为json文件(也可以保存到其他存储介质,如数据库,其他文件存储介质)
    
        环境: python3.7   scarpy1.7.3  都是当前最新版

        安装: pip install scrapy=1.7.3

        创建项目:  scrapy startproject demospider

       
  一. 定义item(爬取的数据结构)
    编辑items.py文件,定义各项数据
    

点击(此处)折叠或打开

  1. import scrapy


  2. class TutorialItem(scrapy.Item):
  3.     # define the fields for your item here like:
  4.     # name = scrapy.Field()
  5.     link = scrapy.Field()
  6.     title = scrapy.Field()
  7.     text = scrapy.Field()
  8.     image_url = scrapy.Field()
  9.     author = scrapy.Field()
  10.     image_paths = scrapy.Field()
    二. 定义爬取方法
        这是最关键的一步,在这里将会解析获取到的html文本,使用scarpy自带的selector解析获取需要的数据。关于selector语法比较多,官方并没有给过多案例,推荐 https://www.jianshu.com/p/489c5d21cdc7, 虽然没有过多例子,但是理论比较全,想要的方法基本都可以找到。
        在spider目录下新建demo_spider.py文件
        

点击(此处)折叠或打开

  1. import scrapy
  2. from demospider.items import TutorialItem




  3. class ImageSpider(scrapy.Spider):

  4.     name = 'imagespider'       # 应用名,执行时使用
  5.     start_urls = [
  6.         'http://www.itpub.net/category/yunwei/'   # 可以写多个,分别进行爬取处理
  7.     ]

  8.     def parse(self, response):                #固定方法,response为每次处理后返回的html,这里主要处理采集第一层页面的数据
  9.         for article in response.css('article.xin_hover'):
  10.             item = TutorialItem()  #必须要新建,不然获取的数据都会一样                        
  11.             item['link'] = article.css('div.post__thumb a::attr("href")').get()
  12.             item['image_url'] = article.css('div.post__thumb img::attr("data-src")').extract()
  13.             item['title'] = article.css('h3.post__title a::text').get()
  14.             item['author'] = article.css('a.entry-author__name::text').get()
  15.             #这里处理第二层连接,文章的具体内容页面
  16.             yield scrapy.Request(item['link'],meta={'item': item}, callback=self.context_parse)


  17.     def context_parse(self,response):
  18.         item = response.meta['item']
  19.         # 有两种方法采集文章内容,这里推荐xpath(xpath属于贪婪匹配,css精确匹配)
  20.         # item['text'] = response.css('div.entry-content p::text').extract()
  21.         item['text'] = response.xpath("//div[@class='entry-content typography-copy']//text()").extract()
  22.         yield item
     三. 定义pipeline
    这步对采集到的数据进行处理,这里直接将数据以json形式存入文本,并且采集文章中的图片
   编辑pipeline.py文件
   

点击(此处)折叠或打开

  1. import json
  2. from scrapy.pipelines.images import ImagesPipeline,FilesPipeline
  3. from scrapy.exceptions import DropItem
  4. import scrapy
  5. import requests
  6. import os
  7. import hashlib
  8. from scrapy.utils.python import to_bytes

  9. BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

  10. class TutorialPipeline(object):

  11.     def open_spider(self, spider):     # pippeline执行的第一个函数,即将把数据存入items.json文件
  12.         self.file = open('items.json', 'w',encoding='utf-8')

  13.     def close_spider(self, spider):    # pipeline执行最后一个函数
  14.         self.file.close()

  15.        #注释内容为用requests下载图片,图片不多但是明显感觉到比框架下载慢的多
  16.     def process_item(self, item, spider):   # 执行完成函数,返回item实例
  17.         # res = requests.get(item['image_url'][0])
  18.         # image_guid = hashlib.sha1(to_bytes(item['image_url'][0])).hexdigest()
  19.         # item['image_paths'] = 'images/full/%s.jpg' % image_guid
  20.         # if not os.path.exists('images/full/'):
  21.         # os.makedirs('images/full/')
  22.         # with open(os.path.join(item['image_paths']),'wb') as f:
  23.         # f.write(res.content)
  24.         line = json.dumps(dict(item))+'\n'
  25.         self.file.write(line)
  26.         return item


  27. class MyImagePipline(ImagesPipeline):    #使用scarpy的image采集方法

  28.     def get_media_requests(self, item, info):   #采集动作,使用item中的图片地址
  29.         for image_url in item['image_url']:
  30.             # print('>>>>>>>>>>>>>>>>>>>>>')
  31.             # print('开始下载图片 '+image_url)
  32.             # print(item)
  33.             # item['image_paths'] = self.file_path(image_url)
  34.             # with open('items_chinaunix.json', 'w',encoding='utf-8') as f:
  35.             # f.write(json.dumps(dict(item))+'\n')
  36.             yield scrapy.Request(image_url,meta={'item': item})   # 采集动作


  37.     def item_completed(self, results, item, info):  # 图片采集完成后执行函数,参数意义查看官网
  38.         image_paths = [x['path'] for ok, x in results if ok]
  39.         if not image_paths:
  40.             raise DropItem("Item contains no images")
  41.         item['image_paths'] = image_paths           #  将图片在本地的存储地址加入item
  42.         return item

四.设置settings.py中相关配置
settings.py是针对项目的配置,里面配置相当丰富,具体查看官网
这里只定义几项必须的配置,其他默认

点击(此处)折叠或打开

  1. #设置的pipeline需要在这里启动,每个pipeline处理不同的动作,
  2. 后面数字表示优先级,越小优先级越高,不超过1000
  3. ITEM_PIPELINES = {
  4.    'demospider.pipelines.MyImagePipline': 300,         
  5.    'demospider.pipelines.TutorialPipeline': 301,
  6. }

  7. IMAGES_STORE = 'images'          # 图片存储的路径


五.执行爬虫应用

执行命令     scrapy crawl imagespider       

将会看到执行过程,采集的数据过程,由于数据少,采集过程相当快,不贴截图了,自己练习体会。




Python爬虫编程思想(157):使用Scrapy从CSV格式转换到JSON格式 通过scrapy框架编写的爬虫很容易进行格式转换,本节将利用爬虫将CSV格式的文件转换为JSON格式的文件。转换的基本原理是将CSV格式的文件作为数据源来读取,然后在parse方法中将CSV文件中的数据通过Item转换为指定的格式,如JSON格式。... 阅读详情

相关推荐

三十一、Scrapy爬取百度图片

Runsen近段时间进入Scrapy,写了几个爬虫练练手,就找百度图片入手了。本文就是Scrapy的入门文章

微信号:RunsenLiu 1033

Scrapy 获取数据保存json文件

Scrapy 获取数据保存json文件

搬砖小能手 2011

Python Scrapy使用Scrapy Crawler Runner进行爬虫运行

本文旨在全面介绍Scrapy框架中的Crawler Runner组件,解释其在爬虫运行管理中的作用,提供实际应用示例。我们将覆盖从基础使用到高级技巧的各个方面,帮助读者掌握这一强大工具。文章将从基础概念开始,逐步深入到高级应用,最后提供实际案例和最佳实践。我们将遵循从理论到实践的路径,确保读者能够全面理解应用所学知识。Scrapy一个用于Python的快速、高级的网页爬取框架,用于爬取网站从页面中提取结构化数据。:Scrapy中用于管理和运行爬虫的核心组件,提供了对爬虫生命周期的细粒度控制。

AI Python 编程之道的博客 1062

使用Scrapy爬取数据保存json、csv文件及乱码解决

安装scrapy pip install scrapy 创建porject scrapy startporject tutorial 执行成功后在目录下生产tutorial文件夹,结构目录如下: 3. 在items.py中定义自己要抓取的数据: #定义爬取对象属性 class ListItem(scrapy.Item): name = scrapy.Field() url = scrapy.Field() order = scrapy.Field() score.

我的博客-记录 5028

Python3.x使用Scrapy爬取数据存储Json

Python3.x使用Scrapy爬取数据存储Json 豆瓣电影排名前250链接 https://movie.douban.com/top250 注:前提安装好python及所需的环境 1.scrapy安装 pip install scrapy 如果提示:no module named ‘win32api’ 则使用下面方式解决 pip install pypiwin32 2.创建项目(进入要创建的目录) scrapy startproject [项目名称] 例如:scrapy startpr

weixin_45167444的博客 1119

scrapy爬取网站返回json数据处理

找到下一页,根据时间戳拼接完整的加载更多url。# for循环遍历数据,取出每一条段子。需要在middlewares文件中设置的一下随机请求头。# # 发起请求。# 转换为python中的字典。# 取出下一页的时间戳。# 返回的是json数据。

叶落无痕的博客 976

scarpy crawl 爬取微信小程序文章

import scrapy from scrapy.linkextractors import LinkExtractor from scrapy.spiders import CrawlSpider, Rule from wxapp.items import WxappItem class WxSpider(CrawlSpider): name ...

aaron_0312的博客 265

web_scarpy_day3

1.进入一个丁香园的论坛,通过谷歌开发者工具查看头部信息 2.复制粘贴相关的头部信息,这里的cookie为登陆之后的cookie,所以需要注册一个丁香园的账号 以后会跟新相关的通过requests携带cookie的方式进行爬去,因为这样就不用每次都要去粘贴cookie的相关信息: 3.找到相关的js请求,分析和查看对应的返回结果 ...

u014691964的博客 208

利用scrapy爬取京东移动端的图片素材和商品信息

一个练习项目需要一些带分类信息的商品测试图片,从现有的电商网站爬取是个不错的选择。刚好最近又在练习scrapy使用,这一篇记录一下用scrapy爬取京东的图片素材保存商品信息的思路。 文中代码共享在我的Github中JDcrawler项目。 文章目录爬取目标动态加载和跨域请求思路分析获取子分类信息获取具体商品信息scrapy配置代码实现item部分spider部分pipeline部分结果展示后续改进总结 爬取目标 为什么选择京东?因为我需要的图片是手机版尺寸,而刚好京东支持手机网页打开的适配。 如下,

T型人小付的博客 2744

Scrapy研究探索(五)——自动多网页爬取(抓取某人博客所有文章

首先,在教程(二)中,研究的是爬取单个网页的方法。在教程(三)中,讨论了Scrapy核心架构。现在在(二)的基础上,结合在(三)中提到的爬取多网页的原理方法,进而进行自动多网页爬取方法研究。 且,为了更好的理解Scrapy核心架构以及数据流,在这里仍采用scrapy.spider.Spider作为编写爬虫的基类。 首先创建project: [python] vie

lyy14011305的博客 604

Scrapy实例2、爬取靓号网

通过实例学习了解Scrapy爬虫框架使用爬取到的数据保存到数据库中和保存一个Json格式的文件。

少年小子的博客 296

scrapy超详细教程(包含部署定时爬取以及js渲染等)

布隆过滤器的原理:其实它里面就是一个改良版的bitmap. 何为bitmap,假设我提前准备好一个数组,然后把源数据经过hash计算,会计算出一个数字,我们按照下标来找到该下标对应的位置,然后设置成1.在scrapy-redis中想要使用布隆过滤器是非常简单的,你可以自己去写这个布隆过滤器的逻辑,不过我建议直接使用第三方的就可以了。因为redis太渺小,万一平常要爬取的数据非常的庞大,这时候默认的过滤器就不灵验了,所以此时需要一个特殊的过滤器。2、在scrapy的settings文件中要设置为。

m0_52709387的博客 819

Scrapy入门实例2:爬取简书网热门专题信息(动态网页,双重Ajax接口)

点击此处查看要爬取的网页 目标,用Scrapy爬取每个专题的前十篇文章的概要信息。 1.先在主网页抓取所有的详细页面的href进行拼接 2.进入详细页面提取信息 值得注意的是主网页和详细页面都是动态网页,都是Ajax加载的,不过规律很容易被发现,在谷歌开发者工具观察一下header就不难发现规律了。属于进阶一丢丢的练手实例。 经发现主页面加载最多到36页。。就构造url咯 items.py i...

Trial & Error 1149

scrapy打造知乎后花园二 :cookie模拟登陆 验证码 爬取首页内容

这篇文章来验证cookie模拟登陆+验证码爬取首页内容

小网管 851

知乎爬虫(scrapy默认配置下单机1小时可爬取60多万条数据)

知乎爬虫(scrapy默认配置下单机1小时可爬取60多万条数据)版本:1.0 作者: AlexTan 代码请移步GitHub:ZhihuSpider前言:在这里特别鸣谢: 九茶 http://blog.csdn.net/bone_ace 学了爬虫差不多快一年了,然而由于项目原因,这还是第一次发爬虫的博客,在学习的过程中,受益最大的就是看了九茶的微博爬虫吧,所以在这里特别鸣谢。 他的代码里涉及

AlexTan_的博客 1万+

Scrapy(3)将蜘蛛狠狠的踩在地上摩擦摩擦

看到蜘蛛,你可能会想起恶心的真蜘蛛,像这样的,够吓人吧,世界上十种最毒蜘蛛,他算上其中之一。你错了,只是你影像中的可恶的蜘蛛,你万万没想到,蜘蛛还蛮可爱的,像这样的,卡姿兰大眼睛,舍不得...

人生代码 ---- 公众号 1166

scrapyscrapy爬取京东商品信息——以自营手机为例

关于scrapy以及使用的代理轮换中间件请参考我的爬取豆瓣文章:【scrapyscrapy按分类爬取豆瓣电影基础信息http://blog.csdn.net/qqxx6661/article/details/56017386爬虫简介主要还是按照scrapy的设计思路来爬,上一篇文章的豆瓣爬取能够很好的反应这种思路,京东爬虫也是如此。主要思路是:获取手机分类(自营)页面——扫描该页所有商品ID——...

蛮三刀酱 2935

scrapy框架

Scrapy 框架介绍与简单案例 2018年01月09日 11:06:06 gxh_apologize 阅读数 1952 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/GXH_APOLOGIZE/article/details/79010585 一、Scrapy介绍 Scrapy是用纯Python实现一个为了爬取网站数据、提取结构性数据而编写的应...

weixin_45126952的博客 205
上一篇: 详解使用restframwork api 实现各类http请求
下一篇: 记录linux升级gcc导致的故障
body221
博客等级 码龄15年 4粉丝 63原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值