Scrapy
是Python开发的一个快速、高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化数据的应用程序框架。Scrapy用途普遍,能够用于数据挖掘、监测和自动化测试;html
Scrapy
吸引人的地方在于它是一个框架,任何人均可以根据需求方便的修改。它也提供了多种类型爬虫的基类,如BaseSpider、sitemap爬虫等;python
Scrapy框架主要由五大组件组成,分别是调度器(Scheduler)、下载器(Downloader)、爬虫(Spider)和实体管道(Item Pipeline)、Scrapy引擎(Scrapy Engine);web
调度器:能够假设成一个URL的优先队列,由它来决定下一个要抓取的网址是什么,同时去除重复的网址;网络
下载器:是全部组件中负担最大的,用于高速地下载网络上的资源;框架
爬虫:是用户最关心的部份,用户定制本身的爬虫,用于从特定的网页中提取本身须要的信息,也能够从中提取出连接,让Scrapy继续抓取下一个页面;dom
实体管道:用于处理爬虫提取的实体,要的功能是持久化实体、验证明体的有效性、清除不须要的信息;scrapy
Scrapy引擎:是整个框架的核心,用来控制调试器、下载器、爬虫,实际上引擎至关于计算机的CPU,控制着整个流程;ide
这里提一下Twisted插件的安装,它的下载地址为: https://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted, 进入后找到twisted,选择下载对应的版本,其中cp表示python版本,下载完成后进入终端,输入pip install Twisted-19.2.0-cp37-cp37m-win_amd64.whl
,这里注意你下载的是哪一个版本就输入哪一个版本的文件名,安装完成后再输入pip install scrapy
就能成功安装scrapy框架了;函数
scrapy startproject 名称
命令新建项目;这样咱们就成功的建立了一个scrapy项目,咱们在PyCharm中看看工具
第三步:能够在刚刚建立的项目的spiders文件夹中建立一个蜘蛛文件,用于爬取网页数据的,咱们试着爬取一下csdn网站,那么新建蜘蛛的命令行是:scrapy genspider csdn www.csdn.net
,其中csdn是你建立的蜘蛛的文件名,而www.csdn.net表示爬取的目标网址的域名,你想爬取哪一个网站就使用哪一个网站的域名。
第四步:若是要启动咱们建立的蜘蛛文件,咱们可使用命令行:scrapy crawl csdn
,这里的csdn
是蜘蛛文件中name的对应值;
第五步:想要测试爬去数据是否成功,咱们能够在项目的模板中建立一个测试文件,如:start_spider.py,而后经过debug来进行项目调试,能够输出咱们想要爬取的网页数据;
from scrapy.cmdline import execute execute(["scrapy", "crawl", "csdn",])
第六步:爬取数据时须要遵循爬虫协议,它用来限定爬虫程序能够爬取的内容范围,位于scrapy 项目的 settings.py文件中默认 ROBOTSTXT_OBEY = True
,即遵照此协议,当咱们想要爬取的内容不符合该协议但仍要爬取时,能够设置 ROBOTSTXT_OBEY = False
,表示不遵照此协议;
第七步:这样咱们就能够开始使用Xpath选择器或者CSS选择器来解析想要爬取的页面数据了;
XPath的全称是XML Path Language,即XML路径语言,它是一种在结构化文档中定位信息的语言,XPath使用路径表达式来选取XML文档中的节点或节点集。节点是经过沿着路径 (path) 或者步 (steps) 来选取的;
谓语用来查找某个特定的节点或者包含某个指定的值的节点,谓语嵌在方括号中,好比//body//a[1]
表示选取属于body 子元素的第一个 a 元素,//a[@href]
表示选取全部拥有名为 href 的属性的 a 元素等;
除了索引、属性外,Xpath还可使用便捷的函数来加强定位的准确性,如contains(s1,s2)
表示若是s1中包含s2则返回true,反之返回false、text()
表示获取节点中的文本内容、starts-with()
表示从起始位置匹配字符串;
使用XPath选取节点的经常使用语法有
表达式书写方式 | 表达式意义 |
---|---|
* | 选择HTML页面中任意的节点 |
/ | 从根节点选取 |
// | 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置 |
. | 选取当前节点 |
.. | 选取当前节点的父节点 |
/bookstore/book[1] | 选取属于 bookstore 子元素的第一个 book 元素 |
/bookstore/book[last()] | 选取属于 bookstore 子元素的最后一个 book 元素 |
/bookstore/book[last()-1] | 选取属于 bookstore 子元素的倒数第二个 book 元素 |
//title[@lang] | 选取全部拥有名为 lang 的属性的 title 元素 |
//title[@lang='eng'] | 选取全部 title 元素,且这些元素拥有值为 eng 的 lang 属性 |
/bookstore/book[price>35.00] | 选取 bookstore 元素的全部 book 元素,且其中的 price 元素的值须大于 35.00 |
/bookstore/book[price>35.00]/title | 选取 bookstore 元素中的 book 元素的全部 title 元素,且其中的 price 元素的值须大于 35.00 |
//* | 选取文档中的全部元素 |
//title[@*] | 选取全部带有属性的 title 元素 |
//book/title , //book/price | 选取 book 元素的全部 title 和 price 元素 |
//title , //price | 选取文档中的全部 title 和 price 元素 |
child::book | 选取全部属于当前节点的子元素的 book 节点 |
child::text() | 选取当前节点的全部文本子节点 |
/bookstore/book/title | 选取全部 title 节点 |
/bookstore/book/price/text() | 选取 price 节点中的全部文本 |
//* | 任意元素 |
咱们来经过XPath选择器爬取网站中咱们想要爬取的信息,以下图咱们来爬去今日推荐中的标题
import scrapy class CsdnSpider(scrapy.Spider): name = 'csdn' allowed_domains = ['www.csdn.net'] start_urls = ['http://www.csdn.net/'] def parse(self, response): # 选择全部class="company_name"的h3元素下的a元素的文本 result = response.xpath('//h3[@class="company_name"]/a/text()').extract() # 将获得的文本列表循环 for i in result: print(i)
咱们来看一下输出打印,看看是否是咱们想要的结果