scrapy是一个爬取网站数据,提取结构数据编写的应用框架
项目流程:
1.新建项目,在项目目录中,输入终端命令:
scrapy startproject mySpider
myspider是项目名称,此时会创建一个myspider文件夹,目录结构大致如下:
mySpider/
scrapy.cfg
mySpider/
__init__.py
items.py
pipelines.py
settings.py
spiders/
__init__.py
...
这些文件是:
- scrapy.cfg: 项目的配置文件。
- mySpider/: 项目的Python模块,将会从这里引用代码。
- mySpider/items.py: 项目的目标文件。
- mySpider/pipelines.py: 项目的管道文件。
- mySpider/settings.py: 项目的设置文件。
- mySpider/spiders/: 存储爬虫代码目录。
2.明确目标
打开items.py文件,item定义结构化数据字段,用来保存爬到的数据
import scrapy
class ItcastItem(scrapy.Item):
name = scrapy.Field()
title = scrapy.Field()
info = scrapy.Field()
3.制作爬虫
在命令行输入,将在myspider/spider目录下创建一个名叫itcast的爬虫,并且指定了爬取域的范围:
scrapy genspider itcast "itcast.cn"
打开 mySpider/spider目录里的 itcast.py,默认增加了下列代码:
import scrapy
class ItcastSpider(scrapy.Spider):
name = "itcast"
allowed_domains = ["itcast.cn"]
start_urls = (
'http://www.itcast.cn/',
)
def parse(self, response):
filename = "teacher.html"
open(filename, 'w').write(response.body)
注意 :
name = “” :这个爬虫的识别名称,必须是唯一的,在不同的爬虫必须定义不同的名字。
allow_domains = [] 是搜索的域名范围,也就是爬虫的约束区域,规定爬虫只爬取这个域名下的网页,不存在的URL会被忽略。
start_urls = () :爬取的URL元祖/列表。爬虫从这里开始抓取数据,所以,第一次下载的数据将会从这些urls开始。其他子URL将会从这些起始URL中继承性生成。
4.最后运行。在myspider目录下执行:
scrapy crawl itcast
提取数据
爬取到的数据是网页源码格式:
<div class="li_txt">
<h3> xxx </h3>
<h4> xxxxx </h4>
<p> xxxxxxxx </p>
然后根据xpath表达式来提取数据:
- /html/head/title: 选择HTML文档中 标签内的
元素 - /html/head/title/text(): 选择上面提到的
元素的文字 - //td: 选择所有的 元素
- //div[@class=“mine”]: 选择所有具有 class=“mine” 属性的 div 元素
将数据封装到itcastItem对象中
def parse(self, response):
#open("teacher.html","wb").write(response.body).close()
# 存放老师信息的集合
items = []
for each in response.xpath("//div[@class='li_txt']"):
# 将我们得到的数据封装到一个 `ItcastItem` 对象
item = ItcastItem()
#extract()方法返回的都是unicode字符串
name = each.xpath("h3/text()").extract()
title = each.xpath("h4/text()").extract()
info = each.xpath("p/text()").extract()
#xpath返回的是包含一个元素的列表
item['name'] = name[0]
item['title'] = title[0]
item['info'] = info[0]
items.append(item)
# 直接返回最后数据
return items