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 scrapyclass mySpiderItem(scrapy.Item):
#name = scrapy.Field()
pass12345
我们对其进行修改:(我需要爬到数据为 姓名、职业和详细信息)
import scrapyclass MyspiderItem(scrapy.Item):
# 这是你需要爬到的数据所包含的字段
name = scrapy.Field()
title = scrapy.Field()
info = scrapy.Field() pass123456789
3.创建爬虫文件
在 spiders/ 下创建文件 demo_spider.py .
然后NotePad++打开该文件,添加如下代码:
import scrapy#引用mySpider目录下的item.py中的MyspiderItemfrom mySpider.items import MyspiderItemclass Demo_Spider(scrapy.Spider):
#爬虫名,该值必须唯一
name = "demo"
#爬虫的爬取域(我要拿传智的数据)
allowed_domains = ["itcast.cn"] #起始的URL列表,也就是第一批请求的地址
start_urls = [ "htt/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 item12345678910111213141516171819202122232425262728293031
4.修改setting文件
打开setting.py文件,修改ROBOTSTXT_OBEY为false,避免某些网站禁止爬虫导致不能爬取数据。
# Obey robots.txt rulesROBOTSTXT_OBEY = False12
取消ITEM_PIPELINES的的注释,该项定义了管道的优先级,数值越小优先级越高
ITEM_PIPELINES = { 'Tencent.pipelines.TencentPipeline': 300,
}123
5.修改管道执行文件
这是默认的管道文件:
import jsonclass MyspiderPipeline(object):
def process_item(self, item, spider):
pass 12345
我们修改它,如下:
import jsonclass 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()1234567891011121314
添加__init__方法,管道事件第一次执行时,创建demo.json文件,并打开。
添加colse_spider方法,管道事件结束时,关闭文件。
修改process_item方法,将Demo_Spider中获得的item数据存到demo.json文件中。
5.启动spider
在mySpider目录中,创建一个data文件夹,用来存放爬取的数据文件。
可以看到,执行完成的详细信息。
demo.json文件中获得了需要的数据。
爬取网站数据的简单例子就这样完成了,相信深入学习之后,肯定能实现非常强大的抓取数据功能。