Crawler之Scrapy:基于scrapy框架实现完整爬取网页内容信息(爬取网站四大步骤)之详细攻略
导读:简洁!简洁!本博主一向喜欢简洁的话语表达最核心的内容,最讨厌说了一大堆,都还没听明白的文章。本文章讲解Scrapy爬虫的案例,通过案例来了解Scrapy爬虫的运行机制。
目录
scrapy运行机制
抓取一个网站的四步骤
1、创建一个Scrapy项目
2、定义Item容器
3、编写爬虫
4、存储内容
(1)、代码测试数据
(2)、代码测试成功后,将代码写入tutorial\spiders\dmoz_spider.py内,修改原先的parse函数
(3)、然后在指定目录下继续运行命令就会得到你想爬取网址网页上的描写、标题、链接
(4)、把筛选的数据存到Item里面:Item是一个容器也是一个类,然后再次对dmoz_spider.py文件进行修改
(5)、使用最简单的方法Feed exports,将爬取的内容保存起来,有四种形式导出JSON、JSON lines、CSV、XML
scrapy运行机制
抓取一个网站的四步骤
1、创建一个Scrapy项目
创建项目文件夹tutorial
scrapy startproject tutorial #在dos内指定路径下,创建项目文件夹tutorial
创建的文件包括如下所示:
- scrapy.cfg: 项目的配置文件;
- tutorial/: 该项目的python模块。以后您将在此加入代码;
- tutorial/items.py: 项目中的item文件;
- tutorial/pipelines.py: 项目中的pipelines文件;
- tutorial/settings.py: 项目的设置文件;
- tutorial/spiders/: 放置spider代码的目录;
2、定义Item容器
Item是保存爬取到的数据的容器,其使用方法和python字典类似,且提供了额外保护机制,避免拼写错误导致的未定义字段错误。首先在item.py文件内,对希望获取的数据建模(获取资源的超链接及其描述)。
3、编写爬虫
Spider是用户编写用于从网站上爬取数据的类。包含了一个用于下载的初始URL,然后是如何跟进网页中的链接以及如何分析页面中的内容,还有提取生成item的方法。在spiders文件内创建方法,然后在指定文件夹下,dos内命令
scrapy crawl dmoz #爬取,调用爬虫dmoz即可在根目录下得到Books(两张网址的源代码)和scrapy.cfg文件
运行这个命令后,发生的一系列事情
class DmozSpider(scrapy.Spider):
name ="dmoz"
allowed_domains = ["dmoz.org"]
start_urls = [
"https://dmoztools.net/Computers/Programming/Languages/Python/Resources/"
"https://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)
4、存储内容
执行爬虫代码即可将所有内容下载到本地,然后再进行筛选内容,我们这里采用第二种方法筛选,Xpath是一门在网页中查找特定信息的语言。所以用XPath来筛选数据,要比使用正则表达式容易些。
Scrapy Selectors实现大浪淘沙,在Scrapy中使用一种基于XPath和CSS的表达式机制:Scrapy Selectors
Selector有4个基本的方法:
- xpath(): 传入xpath表达式,返回该表达式所对应的所有节点的selector list列表 。
- css(): 传入CSS表达式,返回该表达式所对应的所有节点的selector list列表。
- extract(): 序列化该节点为unicode字符串并返回list。
- re(): 根据传入的正则表达式对数据进行提取,返回unicode字符串list列表。
XPath表达式的例子及对应的含义:
- /html/head/title: 选择HTML文档中 <head> 标签内的 <title> 元素
- /html/head/title/text(): 选择上面提到的 <title> 元素的文字
- //td: 选择所有的 <td> 元素
- //div[@class="mine"]: 选择所有具有 class="mine" 属性的 div 元素
为了配合XPath,Scrapy除提供了 Selector 以外,还提供了方法来避免每次从response中提取数据时生成selector的麻烦。
为了介绍Selector的使用方法,需要调用内置的 Scrapy shell 。Scrapy Shell需要您预装好IPython(1个扩大的Python终端)。进入项目的根目录,
当shell载入后,您将得到1个包括response数据的本地 response 变量。输入 response.body 将输出response的包体, 输出 response.headers 可以看到response的包头。
更加重要的是,当输入 response.selector 时, 您将获得到1个可以用于查询返回数据的
- selector(选择器)、
- 映照到 response.selector.xpath() 、
- response.selector.css() 的 快捷方法(shortcut): response.xpath()
- response.css() 。
同时,shell根据response提早初始化了变量 sel 。该selector根据response的类型自动选择最适合的分析规则(XML vs HTML)。
(1)、代码测试数据
scrapy shell "https://dmoztools.net/Computers/Programming/Languages/Python/Books/" #进入shell,然后
response.body #输出网页源代码,从这里面内容进行大浪淘沙
response.headers #输出网页的头
response.xpath("//title").extract() #返回搜索到的列表而.extract()是将列表字符串化
response.xpath("//title/text()").extract() #是根据节点标签去查找的,得到里面的文字
#此时,去网页右键审查元素,提取有用数据
sel.xpath('//ul/li') #搜寻网站列表里所有 <li> 元素:
sel.xpath('//ul/li/text()').extract() #网站的描写
sel.xpath('//ul/li/a/text()').extract() #网站的标题:a标签里面的text
sel.xpath('//ul/li/a/@href').extract() #网站的链接:a标签里面的@href
for sel in response.xpath('//ul/li'): #利用for循环;每一个 .xpath() 调用返回selector组成的list,故可以使用多个 .xpath()来获得某个节点。
title = sel.xpath('a/text()').extract()
link = sel.xpath('a/@href').extract()
desc = sel.xpath('text()').extract()
print (title, link, desc)
#对照网站内容,会发现网页顶层的Top和Python部份也被抓取出来,因为要提取的目标信息是从 <ul class="directory-url"开始的
sites = sel.xpath('//ul[@class="directory-url"]/li') #重新运行会发现此时已将Top和Python部份过滤掉了。
exit() #退出shell,然后去修改代码,修改代码以后,再执行scrapy crawl dmoz
(2)、代码测试成功后,将代码写入tutorial\spiders\dmoz_spider.py内,修改原先的parse函数
def parse(self,response): #修改parse函数
sel=scrapy.Selector(response) #初始化对象,筛选response
sites=sel.xpath("//ul[@class="directory-url"]/li")
for site in sites: #利用for循环;每一个 .xpath() 调用返回selector组成的list,故可以使用多个 .xpath()来获得某个节点。
title = sel.xpath('a/text()').extract()
link = sel.xpath('a/@href').extract()
desc = sel.xpath('text()').extract()
print (title, link, desc)
(3)、然后在指定目录下继续运行命令就会得到你想爬取网址网页上的描写、标题、链接
scrapy crawl dmoz
(4)、把筛选的数据存到Item里面:Item是一个容器也是一个类,然后再次对dmoz_spider.py文件进行修改
def parse(self,response): #再次修改parse函数
sel=scrapy.Selector(response) #初始化对象,筛选response
sites=sel.xpath("//ul[@class="directory-url"]/li")
items=[]
for site in sites: #利用for循环;每一个 .xpath() 调用返回selector组成的list,故可以使用多个 .xpath()来获得某个节点。
item=DmozItem() #实例化容器对象这个类
item["title"]=title = site.xpath('a/text()').extract() #然后将存到item列表里
item["link"]= site.xpath('a/@href').extract()
item["desc"] site.xpath('text()').extract()
items.append(item) #将item加入到列表items内
return items #执行完后返回
(5)、使用最简单的方法Feed exports,将爬取的内容保存起来,有四种形式导出JSON、JSON lines、CSV、XML
导出为最常用的json格式,再指定文件目录下
scrapy crawl dmoz -o items.json -t json #-o 后面是导出文件名,-t 后面是导出类型(一共上边提及的四种)
执行命令代码后,会在tutorial文件下出现一个items.json的文件,记事本方式打开即可查看,所有你从网页上所爬取的信息内容