使用Scrapy爬取一个网站的数据

xiaoxiao2021-02-28  138

Scrapy框架的初步运用


上午刚配置好scrapy框架,下午我就迫不及待的做了一个小demo来测试一下,结果证明scrapy真是太强大了。我感觉等对它掌握到炉火纯青的地步后,就没有什么数据是爬不到的了,O(∩_∩)O哈哈~。


以下步骤是建立在成功安装并配置好scrapy的基础上的.


1.新建一个Scrapy项目

打开cmd控制台界面 输入:scrapy startproject myScrapy

下面是创建的工程中所包含的文件:

__init__.py:项目的初始化文件; items.py:项目的目标文件 pipelines.py:项目的管道文件 settings.py:项目的设置文件 spiders/:存放爬虫代码的文件 spiders/__init__.py:爬虫的初始话文件

2.定义Item

Items是保存爬取到的数据的容器,其使用方法和python字典类似, 它提供了额外保护机制来避免拼写错误导致的未定义字段错误,这类似与ORM中的映射关系。

这是items.py中的默认代码:

import scrapy class mySpiderItem(scrapy.Item): #name = scrapy.Field() pass

我们对其进行修改:(我需要爬到数据为 姓名、职业和详细信息)

import scrapy class MyspiderItem(scrapy.Item): # 这是你需要爬到的数据所包含的字段 name = scrapy.Field() title = scrapy.Field() info = scrapy.Field() pass

3.创建爬虫文件

在 spiders/ 下创建文件 demo_spider.py . 然后NotePad++打开该文件,添加如下代码:

import scrapy #引用mySpider目录下的item.py中的MyspiderItem from mySpider.items import MyspiderItem class Demo_Spider(scrapy.Spider): #爬虫名,该值必须唯一 name = "demo" #爬虫的爬取域(我要拿传智的数据) allowed_domains = ["itcast.cn"] #起始的URL列表,也就是第一批请求的地址 start_urls = [ "http://www.itcast.cn/channel/teacher.shtml" ] #pase方法负责解析返回的数据response data、获得要提取的数据item,以及生成需要进一步处理URL的Request对象。 def parse(self, response): #获取的数据集 node_list = response.xpath("//div[@class='li_txt']") for node in node_list: item = MyspiderItem() #.extract()将xpath对象转换为Unicode字符串 name = node.xpath("./h3/text()").extract() title = node.xpath("./h4/text()").extract() info = node.xpath("./p/text()").extract() item['name'] = name[0] item['title'] = title[0] item['info'] = info[0] #yield :获得一个item数据后暂停循环,然后将它交给管道,之后继续进行循环 yield item

4.修改setting文件

打开setting.py文件,修改ROBOTSTXT_OBEY为false,避免某些网站禁止爬虫导致不能爬取数据。

# Obey robots.txt rules ROBOTSTXT_OBEY = False

取消ITEM_PIPELINES的的注释,该项定义了管道的优先级,数值越小优先级越高

ITEM_PIPELINES = { 'Tencent.pipelines.TencentPipeline': 300, }

5.修改管道执行文件

这是默认的管道文件:

import json class MyspiderPipeline(object): def process_item(self, item, spider): pass

我们修改它,如下:

import json class MyspiderPipeline(object): def __init__(self): self.f = open("demo.json","wb+") #该方法是必要的 def process_item(self, item, spider): content = json.dumps(dict(item),ensure_ascii = False) + ",\n" self.f.write(content.encode("utf-8")) return item def colse_spider(self,spider): self.f.close()

添加__init__方法,管道事件第一次执行时,创建demo.json文件,并打开。

添加colse_spider方法,管道事件结束时,关闭文件。

修改process_item方法,将Demo_Spider中获得的item数据存到demo.json文件中。

5.启动spider

在mySpider目录中,创建一个data文件夹,用来存放爬取的数据文件。

输入:mkdir data,然后:cd data/

使用命令:scrapy crawl demo

可以看到,执行完成的详细信息。

demo.json文件中获得了需要的数据。

爬取网站数据的简单例子就这样完成了,相信深入学习之后,肯定能实现非常强大的抓取数据功能。

转载请注明原文地址: https://www.6miu.com/read-60175.html

最新回复(0)