scrapy是一个从网站中提取结构化数据爬虫框架,简单易用。
内部使用Twisted作为处理网络通信,具有异步特性。
开始构建项目,
scrapy start project my project
#myproject 是项目名称
构建一个框架,
scrapy.cfg
myproject/
__init__.py
items.py
pipelines.py
settings.py
spiders/
__init__.py
...
scrapy.cfg 存放的目录被认为是 项目的根目录 。该文件中包含python模块名的字段定义了项目的设置。
定义要爬取的结构化数据
Item 是保存爬取到的数据的容器;其使用方法和python字典类似, 并且提供了额外保护机制来避免拼写错误导致的未定义字段错误。
定义这个字段定义在items.py
文件中,
class W3SchoolItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
title = scrapy.Field()
link = scrapy.Field()
desc = scrapy.Field()
创建爬虫spider
进入scrapy.cfg 所在目录,运行下面命令,
scrapy genspider myspider
# my spider 是爬虫的名称,可随意定制
编写提取数据的逻辑
进入到spider目录编辑刚刚创建的myspider.py
文件
import scrapy
from scrapy.selector import Selector
from w3school.items import W3SchoolItem
class W3schoolSpiderSpider(scrapy.Spider):
name = "w3school_spider"
allowed_domains = ["w3school.com.cn"]
start_urls = ["http://www.w3school.com.cn/xml/xml_syntax.asp"]
def parse(self, response):
# 选择器获取页面源码,
sel = Selector(response)
# 使用xparh进行筛选,选取所有div中id为navsecond的层所包含的所有div中id为course的ul中ul标签下的,li标签内容,
sites = sel.xpath('//div[@id="navsecond"]/div[@id="course"]/ul[1]/li')
# 定义一个items容器
items = []
# site的内容包括href为链接,title为标题,
for site in sites:
# 成为ie一个item的字典类型
item = W3SchoolItem()
# 对每一个site使用xpath抽取出a标签内的text,href,title.
title = site.xpath('a/text()').extract()
link = site.xpath('a/@href').extract()
desc = site.xpath('a/@title').extract()
item['title'] = [t.encode('utf-8') for t in title]
item['link'] = [l.encode('utf-8') for l in link]
item['desc'] = [d.encode('utf-8') for d in desc]
# 在列表中加入这个字典
items.append(item)
return items
选择器Selector
scrapy中可以使用xpath
和css
从html
中选择数据,
XPath表达式的一些介绍:
1. /html/head/title: 选择HTML文档中 <head> 标签内的 <title> 元素
2. /html/head/title/text(): 选择上面提到的 <title> 元素的文字
3. //td: 选择所有的 <td> 元素
4. //div[@class="mine"]: 选择所有具有 class="mine" 属性的 div 元素
储存数据
在pipelines.py中将取到的item储存在文件中,
import codecs
import json
class W3SchoolPipeline(object):
def __init__(self):
self.file = codecs.open('w3school_utf-8.json','w',encoding='utf-8')
def process_item(self, item, spider):
line = json.dumps(dict(item)) + '\n'
self.file.write(line.encode('unicode_escape'))
print(item)
return item
def close_spider(self,spider):
self.file.close()
配置
在settings.py
文件中加入下面代码(其实文件中已经有了只是被注释了)
ITEM_PIPELINES = {
'w3school.pipelines.W3SchoolPipeline': 300,
}
只差最后一步了,
scrapy crawl myproejct
等待爬取结束,打开文件就可以看到爬到的数据了!
扫码获取源码,
PicsArt_03-02-06.50.43.jpg
网友评论