目录


一:Scrapy框架的执行流程:


  • 1: 爬虫模块指定起始的url,经过爬虫中间件,交给引擎。
  • 2:由Scrapy框架(引擎模块)创建出请求对象,将请求对象传入调度器(队列)。
  • 3:引擎模块,在调度器模块取出请求对象,经过下载中间件,交给下载器。
  • 4:下载器,下载完成后,将响应对象经过下载中间件,交给引擎模块。
  • 5:引擎模块经过爬虫中间件将响应交给爬虫模块,爬虫模块解析响应。
  • 6:响应解析出来如果是数据,则响应模块将数据交给引擎模块,引擎模块再交给数据管道模块。
  • 7:响应解析出来如果是url,则再次循环。
    Scrapy框架---基础入门_ide
    Scrapy框架---基础入门_中间件_02

二:Scrapy的三个内置对象:


  • 1:request请求对象:由url method post_data headers等构成。
  • 2:response响应对象:由url body status headers等构成。
  • 3:item数据对象:本质是个字典。

三:Scrapy入门使用:

1: 环境初始化:

1: CentOS中创建爬虫的虚拟环境:

Scrapy框架---基础入门_数据_03

2: 虚拟环境中安装scrapy框架:


1:sudo apt-get install scrapy
2:pip/pip3 install scrapy


下载过程中如果出现超时报错,不用管,重新命令,继续下载。

Scrapy框架---基础入门_ide_04

3:创建项目:项目名叫myspider:

Scrapy框架---基础入门_中间件_05

4: 使用windows上的pyccharm连接CentOS上的项目:

​参看地址​​:

最后一步下载centos远程的代码:

Scrapy框架---基础入门_数据_06

5:选择远程解释器:

​参看地址​

6: 创建爬虫,指定爬取的范围:

先进入爬虫,然后限定爬虫的范围,防止爬出其他的网站。


scrapy genspider <爬虫名字> <允许爬取的域名>


Scrapy框架---基础入门_数据_07

2: Scrapy框架的熟悉:

Scrapy框架---基础入门_ide_08

Scrapy框架---基础入门_数据_09

四:爬取马场网站上的信息:

目的:爬取马场老师的姓名,级别,描述信息。

1:查看前端:

分析发现 tea_con是总的标签,tea_tex tea_txt_cur是根据不同的老师分类会改变。现在目的是获取所有的li标签,因为三个内容都在里面。所以Xpath语法是:


//div[@class=‘tea_con’]//ul//li


Scrapy框架---基础入门_中间件_10

2:编写代码:

import scrapy

class ItcastSpider(scrapy.Spider):
# 爬虫的名字,用来启动爬虫和区分爬虫
name = 'itcast'
# 爬虫允许爬取的域名范围
allowed_domains = ['itcast.cn']
# 爬虫起始的url地址:Scrapy框架底层会帮我构建请求,发送请求获取响应对象。
start_urls = ['http://www.itcast.cn/channel/teacher.shtml']

def parse(self, response):
"""解析url地址返回的响应对象"""
# 响应对象,可以直接执行xpath语法,提取二进制文本数据: response.body
li_list = response.xpath("//div[@class='tea_con']//ul//li")
for li in li_list:
item = {}
item['name'] = li.xpath(".//h3/text()").extract_first()
item['level'] = li.xpath(".//h4/text()").extract_first()
item['desc'] = li.xpath(".//p/text()").extract_first()

print(item)

3: 使用​​scrapy crawl 爬虫名​​ 执行爬虫:

Scrapy框架---基础入门_中间件_11

执行效果:

Scrapy框架---基础入门_中间件_12

五:整个流程:


  • 1: 在解析函数中提取的url地址如果要发送请求,则必须属于allowed_domains范围内,但是start_urls中的url地址不受这个限制。
  • 2:解析函数中的yield能够传递的对象只能是:BaseItem, Request, dict, None。
  • 3:response.xpath方法的返回结果是一个类似list的类型,其中包含的是selector对象,操作和列表一样,但是有一些额外的方法。
  • 额外方法extract():返回一个包含有字符串的列表
  • 额外方法extract_first():返回列表中的第一个字符串,列表为空没有返回None
  • 4:process_item方法处理完item之后必须返回给引擎。
  • 5:配置项中键为使用的管道类,管道类使用.进行分割,第一个为项目目录,第二个为文件,第三个为定义的管道类。 配置项中值为管道的使用顺序,设置的数值约小越优先执行,该值一般设置为1000以内。

1: 在spiders.itcast下:

import scrapy
class ItcastSpider(scrapy.Spider):
# 爬虫的名字,用来启动爬虫和区分爬虫
name = 'itcast'
# 爬虫允许爬取的域名范围
allowed_domains = ['itcast.cn']
# 爬虫起始的url地址:Scrapy框架底层会帮我构建请求,发送请求获取响应对象。
start_urls = ['http://www.itcast.cn/channel/teacher.shtml']

def parse(self, response):
"""解析url地址返回的响应对象"""
# 响应对象,可以直接执行xpath语法,提取二进制文本数据: response.body
li_list = response.xpath("//div[@class='tea_con']//ul//li")
for li in li_list:
item = {}
item['name'] = li.xpath(".//h3/text()").extract_first()
item['level'] = li.xpath(".//h4/text()").extract_first()
item['desc'] = li.xpath(".//p/text()").extract_first()

# 将数据交付给引擎,再由引擎传递到数据管道中。
yield item

2: 在pipelines.py中:

# 1: 定义爬虫的管道类
class MyspiderPipeline:
# 方法名和参数名固定的
def process_item(self, item, spider):
"""
:param item: 数据,是引擎将爬虫模块的传递过来的[模型类或者字典]
:param spider:爬虫对象,spider.name根据不同的爬虫名,做不同的处理
:return:
"""
if spider.name == "itcast":
print("爬虫名称:{}===============>".format(spider.name))
print(item)
return item

3: 在settings.py中:

ITEM_PIPELINES = {
# key: 管道路径, value是权重,执行的优先级
'myspider.pipelines.MyspiderPipeline': 300,
}

4: 运行结果:说明数据管道中获取到了数据。

Scrapy框架---基础入门_中间件_13