Scrapy
1. 什么是爬虫
网络爬虫是指在互联网上自动爬取网站内容信息的程序,也被称作网络蜘蛛或网络机器人.
一个网络爬虫的基本执行流程可以总结为:
下载页面
一个网页的内容本质上就是一个HTML文本,爬取一个网页内容之前,首先要根据网页的URL下载网页.
提取页面中的数据
HTML下载完成后,对页面中的内容进行分析,并提取出需要的数据,提取的数据可以以多种形式保存起来,CSV/JSON/数据库
提取页面中的链接
通常要获取的数据分布在多个页面中,这些页面彼此联系,一个页面中可能包含一个或多个到其他页面的链接,提取完当前页面中的数据后,还要把页面中的某些链接也提取出来,然后对链接页面进行爬取(循环步骤1)
设计爬虫程序时,还要考虑防止重复爬取相同页面(URL去重),网页搜索策略(深度优先或广度优先等),爬虫访问边界限定等一系列问题.
2. Scrapy简介
- 简单易用
- 灵活易拓展
- 开发社区活跃
安装
pip install scrapy
3. 第一个Scrapy爬虫
项目需求
爬取`http://books.toscrape.com`的图书信息
创建项目
scrapy startproject example(项目名称)
创建好一个名为example的项目
分析页面
- 数据信息
chrmoe浏览器打开http://books.toscrape.com
,选择一本书右键,选择检查
,查看其HTML代码
可以看到,每一本书的信息都包裹在
<article class="product_pod">
元素中,
书名信息在其下<h3><a>
元素的title属性中,
书价信息在其下<p class="price_color">
元素的文本中,链接信息
可以通过单击next按钮访问下一页,选中页面下方的next按钮并右击”检查”,查看其HTML代码,可以得知下一页的URL在 ul.pager > li.next > a 元素的href属性中
- 数据信息
实现Spider
在Scrapy中编写爬虫,即实现一个scrapy.Spider的子类.
实现爬虫的Python文件位于example/spiders
目录下,在该目录下创建新文件book_spider.py
,其代码如下:
# _*_ coding:utf-8 _*_
import scrapy
class BooksSpider(scrapy.Spider):
# 每个爬虫的唯一标示
name = 'books'
# 定义爬虫爬取的起始点,起始点可以是多个,这里只有一个
start_urls = ['http://books.toscrape.com/']
def parse(self, response):
# 提取数据
# 每一本书的信息在<article class="product_pod">中,我们使用 css()方法找到所有这样的article元素,并依次迭代
for book in response.css('article.product_pod'):
# 书名信息在 article > h3 > a 元素的title属性
# 例如 <a title = "A Light in the Attic">A Light in the...</a>
name = book.xpath('./h3/a/@title').extract_first()
# 书价信息在<p class="price_color">的Text中
price = book.css('p.price_color::text').extract_first()
yield {
'name': name,
'price': price,
}
# 提取链接
# 下一页的url在 ul.pager > li.next > a 里面
next_url = response.css('ul.pager li.next a::attr(href)').extract_first()
if next_url:
# 如果找到下一页的url,得到绝对路径,构造新的Response对象
next_url = response.urljoin(next_url)
yield scrapy.Request(next_url, callback=self.parse)
name 属性
一个Scrapy项目中可能有多个爬虫,每个爬虫的name属性是其自身的唯一标识,在一个项目中不能有同名的爬虫
start_urls 属性
一个爬虫总要从某个(或某些)页面开始爬取,我们称这样的页面为起始爬取点, start_urls 属性用来设置一个爬虫的起始爬取点.
parse 方法
当一个页面下载完成后,Scrapy引擎会回调一个我们指定的页面解析函数(默认为parse方法)解析页面. 一个页面解析函数通常需要完成两个任务: 提取页面中的数据(使用XPath或CSS选择器) 提取页面中的链接,并产生对链接页面的下载请求
页面解析函数通常被实现成一个生成器函数,每一项从页面中提取的数据以及每一个对链接页面的下载请求都由yield语句提交给Scrapy引擎
运行爬虫
scrapy crawl <SPIDER_NAME>
这里可以运行以下命令,并将数据保存到csv文件中
scrapy crawl books -o books.csv
查看books.csv文件,当当当,完成~~~