构建自己的数据王国
一、新建项目(scrapy startproject)
- 在爬取前,必须创建一个新的scrapy项目,进入自定义的项目目录中,运行下列命令:
scrapy startproject myspider
- 其中,myspider为项目名称,可以看到将会创建一个myspider文件夹,目录结构大致如下:
这些文件的主要作用列举如下:
- scrapy.cfg:项目的配置文件
- myspider/:项目的python模块,将会从这里引用代码
- myspider/items.py:项目的目标文件
- myspider/pipelines.py:项目的管道文件
- myspider/settings.py:项目的设置文件
- myspider/spiders/:存储爬虫代码目录
二、 明确目标(myspider/items.py)
准备抓取网站http://www./channel/teacher.shtml网站里的所有讲师的姓名、职称和个人信息。
- Item用来定义结构化数据字段,用以保存爬取到的数据,有点像python中的dict,但是提供了一些额外的保护减少错误。
- 可以在myspider/items.py中创建一个Item类,并且通过在Item类中继续定义多个Field类(该类是继承了dict)来完善该Item类
- 接下来,创建一个ItcastItem类,和构建item模型(model)。
import scrapy
class ItcastItem(scrapy.Item):
name = scrapy.Field()
level = scrapy.Field()
info = scrapy.Field()
三、 制作爬虫(spiders/itcastspider.py)
爬虫功能要分两步:
1、爬数据
- 在当前目录下输入命令,将在myspider/spiders目录下创建一个名为itcast的爬虫,并指定爬取域的范围:
scrapy genspider itcast ""
- 打开myspider/spiders目录里的itcast.py,默认增加了下列代码:
import scrapy
class ItcastSpider(scrapy.Spider):
name = 'itcast'
allowed_domains = ['']
start_urls = ['http://www./channel/teacher.shtml']
def parse(self, response):
pass
其实也可以由我们自行创建itcast.py并编写上面的代码,只不过使用命令可以免去编写固定代码的麻烦。
要建立一个spider,你必须用scrapy.spider类创建一个子类,并确定了三个强制的属性和一个方法。
- name = ‘itcast’:这个爬虫的识别名称,必须是唯一的,在不同的爬虫必须定义不同的名字
- allow_domains=[]:是搜索的域名范围,也就是爬虫的约束区域,规定爬虫只爬取这个域名下的网页,不存在的URL会被忽略
- start_urls=[]:爬取的URL元祖/列表,爬虫从这里开始抓取数据,所以,第一次下载的数据将会从这些urls开始,其他子URL将会从这些起始URL中继承性生成。
- parse(self,response):解析的方法,每个初识URL完成下载后将被调用,调用的时候传入从每一个URL传回的Response对象来作为唯一参数主要作用如下:
- 负责解析返回的网页数据(reponse.body),提取结构化数据(生成item)
- 生成需要下一页的URL请求
- 将start_urls的值修改为需要爬取的第一个url
start_urls=['http://www./channel/teacher.shtml']
def parse(self, response):
filename="teacher.html"
with open(filename,'wb') as f:
f.write(response.body)
- 然后在myspider/myspider目录下执行
scrapy crawl itcast
- 运行后,打印的日志出现[scrapy.core.engine] INFO: Spider closed (finished),代表执行完成。
2、取数据
- 爬取整个网页源码完毕,接下来是提取过程,首先观察页面源码:
<div class="li_txt">
<h3> xxx </h3>
<h4> xxxxx </h4>
<p> xxxxxxx </p>
- 之前在myspider/items.py里定义了一个MyspiderItem类,这里引入进来
from myspider.items import MyspiderItem
- 然后将我们得到的数据封装到一个MyspiderItem对象中,可以保存每个老师的属性:
def parse(self, response):
# filename="teacher.html"
# with open(filename,'wb') as f:
# f.write(response.body)
items=[]
for each in response.xpath("//div[@class='li_txt']"):
item=MyspiderItem()
name=each.xpath("h3/text()").extract()[0]
level=each.xpath("h4/text()").extract()[0]
info=each.xpath("p/text()").extract()[0]
item['name']=name
item['level']=level
item['info']=info
items.append(item)
return items
四、 保存数据
我们暂时先不处理管道。
scrapy保存信息的最简单的方法主要有四中,-o输出指定格式的文件,命令如下:
#json格式,默认为unicode编码
scrapy crawl itcast -o teachers.json
scrapy crawl itcast -o teachers.jsonl
scrapy crawl itcast -o teachers.csv
scrapy crawl itcast -o teachers.xml
|