使用Scrapy 抓取一个网站一共需要四个步骤:
创建一个Scrapy 项目
定义一个 Item容器
编写爬虫
存储内容
目标网址 http://dmoztools.net/
第一步 : 在终端输入命令scrapy startproject quotes
发现当前项目下创建了quotes这个包
在items.py文件里
我们想获取 标题 和 超链接 和 描述
接下来是编写 爬虫类Spider,spider 是用户编写用于从网站上爬取数据的类
其包含了一个用于下载的初始URL,然后是如何 更进网页中的链接以及如何分析页面中的内容,还有提取生成item的方法
import scrapy
class DmozSpider(scrapy.Spider):
name = "dmoz"
allowed_domains = ['dmoztools.net']
start_urls = [
'http://dmoztools.net/Computers/Programming/Languages/Python/Resources/',
'http://dmoztools.net/Computers/Programming/Languages/Python/Books/'
]
def parse(self, response, ):
filename = response.url.split('/')[-2]
with open(filename,'wb') as f:
f.write(response.body)
爬取完成之后会发现:
在Scrapy中是使用一种基于XPath 和 CSS的表达式机制:Scrapy Selectors
scrapy shell “网址”
在Terminal 里 打开 爬虫文件的根目录 ,输入该命令 。
这个直接返回的就是网址的HTML 代码,会返回到response上
所以我们就可以直接使用 response进行操作。
比如查看网页的 body
response.body
response.headers
由于response.body返回很多的信息,所以我们要筛选出我们需要的信息,xpath就是其中一种筛选信息的方法,其他还有正则表达式等等方法
XPath
是一门在网页中查找特定信息的语言。所以用XPath来筛选数据,要比正则表达式容易些
xpath:
/html/head/title
: 是选择HTML 文档中<head>
标签里的<title>
元素
/html/head/title/text()
:选择上面提到的<title>
元素的文字
//td
:选择所有的<td>
元素
//div[@class = "mine"]
:选择所有具有class = “mine”属性的div元素
通过网站的这个标签:
设置了xpath 的查询规则 ,成功查找到 标题
response.xpath('//div[@class="site-title"]/text()').extract()
设置xpath查询规则,成功找到 描述文字
response.xpath('//div[@class="site-descr "]/text()').extract()
import scrapy
from quotes.quotes.items import *
class DmozSpider(scrapy.Spider):
name = "dmoz"
allowed_domains = ['dmozdir.org/Category/']
start_urls = [
'https://www.dmozdir.org/Category/?SmallPath=80',
'https://www.dmozdir.org/Category/?SmallPath=73'
]
def parse(self, response, ):
titles = response.selector.xpath('//ul/li/h4/a/text()').extract()
links = response.selector.xpath('//ul/li/h4/a/@href').extract()
descs = response.selector.xpath('//ul/li/p/text()').extract()
items = []
if len(titles) == len(links) == len(descs):
for i in range(len(titles)):
# print(titles[i], links[i], decss[i])
item = DmozItem()
item['title'] = titles[i]
item['link'] = links[i]
item['desc'] = descs[i]
items.append(item)
return items
# Define here the models for your scraped items
#
# See documentation in:
# https://docs.scrapy.org/en/latest/topics/items.html
import scrapy
class DmozItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
title = scrapy.Field()
link = scrapy.Field()
src = scrapy.Field()
然后我们在CMD 中,tutorail 的根目录下,执行命令:scrapy crawl dmoz -o items.json -t json
执行完毕后,在 tutorial 根目录 下就会有一个名为 items.json 的文件。