Scrapy教程——搭建环境、创建项目、爬取内容、保存文件

1、创建项目

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

例如,我需要在D:\00Coding\Python\scrapy目录下存放该项目,打开命令窗口,进入该目录,执行以下命令:

scrapy startproject  tutorial

PS:tutorial可以替换成任何你喜欢的名称,最好是英文

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

tutorial/
    scrapy.cfg
    tutorial/
        __init__.py
        items.py
        pipelines.py
        settings.py
        spiders/
            __init__.py
            ...

这些文件分别是:

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

2、定义Item

Item 是保存爬取到的数据的容器;其使用方法和python字典类似,并且提供了额外保护机制来避免拼写错误导致的未定义字段错误。我们需要从想要爬取的网站(这里爬取新浪新闻)中获取以下属性:

新闻大类url、新闻大类title;

新闻小类url、新闻小类title;

新闻url、新闻title;

新闻标题、新闻内容;

对此,在item中定义相应的字段。编辑tutorial目录中的 items.py 文件:

[python] view plain copy

  1. from scrapy.item import Item, Field
  2. class TutorialItem(Item):
  3. # define the fields for your item here like:
  4. # name = scrapy.Field()
  5. parent_title = Field()
  6. parent_url = Field()
  7. second_title = Field()
  8. second_url = Field()
  9. path = Field()
  10. link_title = Field()
  11. link_url = Field()
  12. head= Field()
  13. content = Field()
  14. pass

3、编写爬虫(Spider)

Spider是用户编写用于从单个网站(或者一些网站)爬取数据的类。

1、sinaSpider.py文件:

包含了一个用于下载的初始URL,如何跟进网页中的链接以及如何分析页面中的内容,提取生成 item 的方法。为了创建一个Spider,您必须继承 scrapy.Spider 类,且定义以下三个属性:

name:用于区别Spider。该名字必须是唯一的,您不可以为不同的Spider设定相同的名字。

start_urls:包含了Spider在启动时进行爬取的url列表。因此,第一个被获取到的页面将是其中之一。后续的URL则从初始的URL获取到的数据中提取。

parse() 是spider的一个方法。被调用时,每个初始URL完成下载后生成的Response 对象将会作为唯一的参数传递给该函数。该方法负责解析返回的数据(response data),提取数据(生成item)以及生成需要进一步处理的URL的Request 对象。

当我们爬取了大类,然后这时候没有保存item,而是传递item到小类,爬取完小类之后,我们需要去新闻详情页爬取新闻的内容和标题:

主要思路是:paser->second_paser->detail_parse

以下是sinaSpider的全部代码:

[python] view plain copy

  1. # -*-coding: utf-8 -*-
  2. __author__= ‘George‘
  3. import sys, os
  4. reload(sys)
  5. sys.setdefaultencoding("utf-8")
  6. from scrapy.spider import Spider
  7. from scrapy.http import Request
  8. from scrapy.selector import Selector
  9. from tutorial.items import TutorialItem
  10. base ="d:/dataset/" #存放文件分类的目录
  11. class SinaSpider(Spider):
  12. name= "sina"
  13. allowed_domains= ["sina.com.cn"]
  14. start_urls= [
  15. "http://news.sina.com.cn/guide/"
  16. ]#起始urls列表
  17. def parse(self, response):
  18. items= []
  19. sel= Selector(response)
  20. big_urls=sel.xpath(‘//div[@id=\"tab01\"]/div/h3/a/@href‘).extract()#大类的url
  21. big_titles=sel.xpath("//div[@id=\"tab01\"]/div/h3/a/text()").extract()
  22. second_urls =sel.xpath(‘//div[@id=\"tab01\"]/div/ul/li/a/@href‘).extract()#小类的url
  23. second_titles=sel.xpath(‘//div[@id=\"tab01\"]/div/ul/li/a/text()‘).extract()
  24. for i in range(1,len(big_titles)-1):#这里不想要第一大类,big_title减去1是因为最后一个大类,没有跳转按钮,也去除
  25. file_name = base + big_titles[i]
  26. #创建目录
  27. if(not os.path.exists(file_name)):
  28. os.makedirs(file_name)
  29. for j in range(19,len(second_urls)):
  30. item = TutorialItem()
  31. item[‘parent_title‘] =big_titles[i]
  32. item[‘parent_url‘] =big_urls[i]
  33. if_belong =second_urls[j].startswith( item[‘parent_url‘])
  34. if(if_belong):
  35. second_file_name =file_name + ‘/‘+ second_titles[j]
  36. if(not os.path.exists(second_file_name)):
  37. os.makedirs(second_file_name)
  38. item[‘second_url‘] = second_urls[j]
  39. item[‘second_title‘] =second_titles[j]
  40. item[‘path‘] =second_file_name
  41. items.append(item)
  42. for item in items:
  43. yield Request(url=item[‘second_url‘],meta={‘item_1‘: item},callback=self.second_parse)
  44. #对于返回的小类的url,再进行递归请求
  45. def second_parse(self, response):
  46. sel= Selector(response)
  47. item_1= response.meta[‘item_1‘]
  48. items= []
  49. bigUrls= sel.xpath(‘//a/@href‘).extract()
  50. for i in range(0, len(bigUrls)):
  51. if_belong =bigUrls[i].endswith(‘.shtml‘) and bigUrls[i].startswith(item_1[‘parent_url‘])
  52. if(if_belong):
  53. item = TutorialItem()
  54. item[‘parent_title‘] =item_1[‘parent_title‘]
  55. item[‘parent_url‘] =item_1[‘parent_url‘]
  56. item[‘second_url‘] =item_1[‘second_url‘]
  57. item[‘second_title‘] =item_1[‘second_title‘]
  58. item[‘path‘] = item_1[‘path‘]
  59. item[‘link_url‘] = bigUrls[i]
  60. items.append(item)
  61. for item in items:
  62. yield Request(url=item[‘link_url‘], meta={‘item_2‘:item},callback=self.detail_parse)
  63. def detail_parse(self, response):
  64. sel= Selector(response)
  65. item= response.meta[‘item_2‘]
  66. content= ""
  67. head=sel.xpath(‘//h1[@id=\"artibodyTitle\"]/text()‘).extract()
  68. content_list=sel.xpath(‘//div[@id=\"artibody\"]/p/text()‘).extract()
  69. for content_one in content_list:
  70. content += content_one
  71. item[‘head‘]= head
  72. item[‘content‘]= content
  73. yield item

2、pipelines.py

     主要是对于抓取数据的保存(txt),这里把文件名命名为链接中‘/‘替换成‘_‘

[python] view plain copy

  1. # -*- coding: utf-8 -*-
  2. # Define your item pipelines here
  3. #
  4. # Don‘t forget to add your pipeline to the ITEM_PIPELINES setting
  5. # See: http://doc.scrapy.org/en/latest/topics/item-pipeline.html
  6. from scrapy import signals
  7. import json
  8. import codecs
  9. import sys
  10. reload(sys)
  11. sys.setdefaultencoding( "utf-8" )
  12. class SinaPipeline(object):
  13. def process_item(self, item, spider):
  14. link_url = item[‘link_url‘]
  15. file_name = link_url[7:-6].replace(‘/‘,‘_‘)
  16. file_name += ".txt"
  17. fp = open(item[‘path‘]+‘/‘+file_name, ‘w‘)
  18. fp.write(item[‘content‘])
  19. fp.close()
  20. return item

3、setting.py

    这是设置文件,这里需要设置同时开启的线程数目、日志打印的级别等

[python] view plain copy

  1. # -*- coding: utf-8 -*-
  2. BOT_NAME = ‘tutorial‘
  3. SPIDER_MODULES = [‘tutorial.spiders‘]
  4. NEWSPIDER_MODULE = ‘tutorial.spiders‘
  5. ITEM_PIPELINES = {
  6. ‘tutorial.pipelines.SinaPipeline‘: 300,
  7. }
  8. LOG_LEVEL = ‘INFO‘
  9. ROBOTSTXT_OBEY = True

爬取结果

这里的文件夹是根据分类,然后创建的;

这是大类的文件夹,现在我们已经将item都爬下来了,就需要存了,这里只想要存内容,所以直接将item里面的content字段的内容写入txt。

这里通过将链接进行处理,转换成文件名,最后保存到所属的那个类里;

原文地址:https://www.cnblogs.com/ws0751/p/8183428.html

时间: 2024-10-28 00:34:18

Scrapy教程——搭建环境、创建项目、爬取内容、保存文件的相关文章

Scrapy精华教程(六)——自动爬取网页之II(CrawlSpider)

一.目的. 在教程(二)(http://blog.csdn.net/u012150179/article/details/32911511)中使用基于Spider实现了自己的w3cschool_spider,并在items.py中定义了数据结构, 在pipelines.py中实现获得数据的过滤以及保存. 但是以上述方法只能爬取start_url列表中的网页,而网络爬虫如google等搜索引擎爬虫实现的就是对整个互联网的爬取,所以在本教程中研究使用scrapy自动实现多网页爬取功能. 在教程(五)

从零开始学Xamarin.Forms(二) 环境搭建、创建项目

一.环境搭建 Windows下环境搭建: 1.下载并安装jdk及android sdk: 2.下载Xamarin.VisualStudio,可以从官方下在线安装的,也可以下载3.0.54版本的离线安装包. 3.下载完毕运行安装程序,按照提示一步一步安装即可. Mac下环境搭建: 官方在线安装 二.创建Xamarin.Forms项目 1.新建项目,选择"Blank App(Xamarin.Forms Portable)" 创建完毕后,项目结构如下图: 2.更新程序集 由于默认的Xamar

python爬虫教程:《利用Python爬取表情包》

python爬虫教程:<利用Python爬取表情包>,微信没有表情包?不用愁!老师带领你使用多线程爬虫一键爬取20w的表情包~ python爬虫教程:<利用Python爬取表情包>,微信没有表情包?不用愁!老师带领你使用多线程爬虫一键爬取20w的表情包~ python爬虫教程:<利用Python爬取表情包>,微信没有表情包?不用愁!老师带领你使用多线程爬虫一键爬取20w的表情包~ python爬虫教程:<利用Python爬取表情包>,微信没有表情包?不用愁!

requests实例4:图片的爬取与保存

requests实例4:图片的爬取与保存 代码框架: 1 # coding=gbk 2 import requests 3 import os 4 url = "http://image.nationalgeographic.com.cn/2017/0211/20170211061910157.jpg" 5 root = "D://pics//" 6 path = root + url.split('/')[-1] 7 try: 8 if not os.path.e

vue环境搭建及创建项目

安装node环境:node环境下载地址:https://nodejs.org/zh-cn/download/,可根据对应的操作系统版本下载安装 安装完成后查看对应的node和npm版本,如没有出现对应版本号则代表安装失败 安装vue-cli(vue脚手架)安装vue-cli之前确保要先是否安装webpack webpack安装命令:npm install webpack -g 安装好后开始安装 vue-cli npm install -g vue-cli -g代表的是全局安装 vue-cli安装

初识scrapy,美空网图片爬取实战

这俩天研究了下scrapy爬虫框架,遂准备写个爬虫练练手.平时做的较多的事情是浏览图片,对,没错,就是那种艺术照,我骄傲的认为,多看美照一定能提高审美,并且成为一个优雅的程序员.O(∩_∩)O~ 开个玩笑,那么废话不多说,切入正题吧,写一个图片爬虫. 设计思路:爬取目标为美空网模特照片,利用CrawlSpider提取每张照片的url地址,并将提取的图片url写入一个静态html文本作为存储,打开即可查看图片. 我的环境是win8.1, python2.7+Scrapy 0.24.4,如何配环境我

python scrapy简单爬虫记录(实现简单爬取知乎)

之前写了个scrapy的学习记录,只是简单的介绍了下scrapy的一些内容,并没有实际的例子,现在开始记录例子 使用的环境是python2.7, scrapy1.2.0 首先创建项目 在要建立项目的目录下执行命令scrapy startproject tutorial scrapy会帮你建立好项目,接着创建蜘蛛scrapy genspider zhuhuSpider zhihu.com 当前的文件结构是 --tutorial --spiders --__init__.py --zhihuSpid

Python爬虫项目--爬取链家热门城市新房

本次实战是利用爬虫爬取链家的新房(声明: 内容仅用于学习交流, 请勿用作商业用途) 环境 win8, python 3.7, pycharm 正文 1. 目标网站分析 通过分析, 找出相关url, 确定请求方式, 是否存在js加密等. 2. 新建scrapy项目 1. 在cmd命令行窗口中输入以下命令, 创建lianjia项目 scrapy startproject lianjia 2. 在cmd中进入lianjia文件中, 创建Spider文件 cd lianjia scrapy genspi

【图文详解】scrapy安装与真的快速上手——爬取豆瓣9分榜单

写在开头 现在scrapy的安装教程都明显过时了,随便一搜都是要你安装一大堆的依赖,什么装python(如果别人连python都没装,为什么要学scrapy-.)wisted, zope interface,pywin32---现在scrapy的安装真的很简单的好不好! 代码我放github上了,可以参考: https://github.com/hk029/doubanbook 为什么要用scrapy 我之前讲过了requests,也用它做了点东西,([图文详解]python爬虫实战--5分钟做