python|爬虫scrapy框架不理解(通俗?点告诉你)

目录
前言
?、爬取网址和内容,谁来定?
?、我定好内容了,谁来指挥?
【python|爬虫scrapy框架不理解(通俗?点告诉你)】三、settings和piplines
总结
前言 简单来说scrapy是?个爬?框架,开发者定义好了内置的?法,我们只用修改其中执行的代码,就可以使?内置的方法爬取内容。你可以把它想象得像我们安装的模块,我们引?模块只管调?,知道它干了什么,下面这张图就形象的为我们展示了scrapy的结构:
python|爬虫scrapy框架不理解(通俗?点告诉你)
文章图片


?、爬取网址和内容,谁来定? spiders(爬?),就是放置了爬??件的地?,我们这?设置了爬取的url,爬取的内容,还有将内容扔给引擎,总代码如下:

import scrapy import bs4 from ..items import DoubanItem # 需要引用DoubanItem,它在items里面。因为是items在top250.py的上一级目录,所以要用..items,这是一个固定用法。 class DoubanSpider(scrapy.Spider): #定义一个爬虫类DoubanSpider。 name = 'douban' #定义爬虫的名字为douban。 allowed_domains = ['book.douban.com'] #定义爬虫爬取网址的域名。 start_urls = [] #定义起始网址。 for x in range(3): url = 'https://book.douban.com/top250?start=' + str(x * 25) start_urls.append(url) #把豆瓣Top250图书的前3页网址添加进start_urls。 def parse(self, response): #parse是默认处理response的方法。 bs = bs4.BeautifulSoup(response.text,'html.parser') #用BeautifulSoup解析response。 datas = bs.find_all('tr',class_="item") #用find_all提取元素,这个元素里含有书籍信息。 for data in datas: #遍历data。 item = DoubanItem() #实例化DoubanItem这个类。 item['title'] = data.find_all('a')[1]['title'] #提取出书名,并把这个数据放回DoubanItem类的title属性里。 item['publish'] = data.find('p',class_='pl').text #提取出出版信息,并把这个数据放回DoubanItem类的publish里。 item['score'] = data.find('span',class_='rating_nums').text #提取出评分,并把这个数据放回DoubanItem类的score属性里。 print(item['title']) #打印书名。 yield item #yield item是把获得的item传递给引擎

以下我将代码分开给大家讲解以下
1)import模块
from ..items import DoubanItem

..items我们要分为两部分,“..”和“items”
  • 相对路径?家都知道,.. 是指返回上?层?件夹
  • items是模块,也是我们??编写的items.py
所以..items就是我们跳出的spiders?件夹,返回上?个?件夹,在??寻找items.py也就是这个?件,如下图所示: python|爬虫scrapy框架不理解(通俗?点告诉你)
文章图片

2)定义的网址的代码
class DoubanSpider(scrapy.Spider): #定义一个爬虫类DoubanSpider。 name = 'douban' #定义爬虫的名字为douban。 allowed_domains = ['book.douban.com'] #定义爬虫爬取网址的域名。 start_urls = [] #定义起始网址。 for x in range(3): url = 'https://book.douban.com/top250?start=' + str(x * 25) start_urls.append(url) #把豆瓣Top250图书的前3页网址添加进start_urls。

  • allowed_domains:定义了爬取网站的域名,域名是指它的网站最前?的内容,这是这个网站的唯?标识,我们设置allowed_domains去定义爬取的域名,这样我们也让爬?知道自己要爬的是哪个网站的内容;
  • start_urls :定义了要爬取网站的网址,指的是设置我们爬取哪些?址,就是在这个域名下,它有哪些网址要爬,我们就定义在里面;
重要提示:
  • 这?的变量是不能改变的!!这是框架固定好的变量;
  • 当我们设置好链接在start_urls之后,框架会?动发起请求,不需要我们requests;
3) 爬取的代码
def parse(self, response): #parse是默认处理response的方法。 bs = bs4.BeautifulSoup(response.text,'html.parser') #用BeautifulSoup解析response。 datas = bs.find_all('tr',class_="item") #用find_all提取元素,这个元素里含有书籍信息。 for data in datas: #遍历data。 item = DoubanItem() #实例化DoubanItem这个类。 item['title'] = data.find_all('a')[1]['title'] #提取出书名,并把这个数据放回DoubanItem类的title属性里。 item['publish'] = data.find('p',class_='pl').text #提取出出版信息,并把这个数据放回DoubanItem类的publish里。 item['score'] = data.find('span',class_='rating_nums').text #提取出评分,并把这个数据放回DoubanItem类的score属性里。 print(item['title']) #打印书名。 yield item #yield item是把获得的item传递给引擎

  • 框架自动发送请求后,爬取的内容返回了response,所以我们定义函数的时候要?response接收爬取的内容:
def parse(self, response):
#parse是默认处理response的方法。 提示一下:这是固定的写法噢,parse是?定要这样写
  • scrapy.Field():Field对象的主要目就是在一个地方定义好所有的数据而已,也就是定义好内容在同一个传输管道里。
?、我定好内容了,谁来指挥? 通俗的说,当我们安排好了很多个url去获取数据时,如果没有?来安排他们,就会乱成?团,这个时候Scheduler调度器的作?来了,我们的爬?到调度器,经过了?些内容,其实就是在把requests请求进?配置配置好了之后把请求发给下载器(Downloader)下载;
而在框架中是怎么实现的呢?
scrapy crawl douban

这?的crawl 其实就是 来启动框架配置的调度器的它存在于middlewares.py,这个?件是?动?成的,内容是调度器和下载器的?法属性,所以我们仅?知道它的过程,不需要修改代码。
python|爬虫scrapy框架不理解(通俗?点告诉你)
文章图片

三、settings和piplines 1)settings中含有多个变量配置,常见的如下:
BOT_NAME = 'douban' #Scrapy项目的名字,这将用来构造默认 User-Agent,同时也用来log,当您使用 startproject 命令创建项目时其也被自动赋值。 SPIDER_MODULES = ['douban.spiders'] #Scrapy搜索spider的模块列表 默认: [xxx.spiders] NEWSPIDER_MODULE = 'douban.spiders' #使用 genspider 命令创建新spider的模块。默认: 'xxx.spiders' #爬取的默认User-Agent,除非被覆盖 #USER_AGENT = 'demo1 (+http://www.yourdomain.com)' #如果启用,Scrapy将会采用 robots.txt策略 ROBOTSTXT_OBEY = True

想知道每个变量的内容可以查看: https://blog.csdn.net/u011781521/article/details/701881712)piplines: 简单来说,这是?个传输的管道,就是传输的时候数据会返回到这?。 当爬?爬取的信息返回到了管道,我们就可以在这个piplines写下存储的代码,去获取 资源。 总结 以上就是今天要讲的内容,本文介绍了爬?框架scrapy的一些相关知识。
欢迎大家留言一起讨论问题~~~

    推荐阅读