书名信息在其下h3 > a元素的title属性中,如A Light in the...; 书价信息在其下元素的文本中,如
£51.77
。
Scrapy是一个使用Python语言(基于Twisted框架)编写的开源网络爬虫框架,目前由Scrapinghub Ltd维护。Scrapy简单易用、灵活易拓展、开发社区活跃,并且是跨平台的。在Linux、MaxOS以及Windows平台都可以使用。
安装验证:
pip install scrapy
import scrapy
scrapy.version_info
抓取在专门供爬虫初学者训练爬虫技术的网站 上爬取书籍信息,如图所示。
首先,我们要创建一个Scrapy项目,在shell中使用scrapy startproject命令:
编写爬虫程序之前,首先需要对待爬取的页面进行分析,主流的浏览器中都带有分析页面的工具或插件分析页面。
1.数据信息 在浏览器中打开页面http://books.toscrape.com,选中其中任意 一本书并右击,然后选择“审查元素”,查看其HTML代码,如图1-2所示。
可以看到,每一本书的信息包裹在
书名信息在其下h3 > a元素的title属性中,如A Light in the...; 书价信息在其下元素的文本中,如
£51.77
。
2.链接信息为第一页书籍列表页面,可以通过单击next按钮访问下一 页,选中页面下方的next按钮并右击,然后选择“审查元素”,查看其HTML代码
可以发现,下一页的URL在ul.pager > li.next > a元素的href属性中,是 一个相对URL地址,如
分析完页面后,接下来编写爬虫。在Scrapy中编写一个爬虫,即实现一个scrapy.Spider的子类。 实现爬虫的Python文件应位于exmaple/spiders目录下,在该目录下创建新文件book_spider.py。然后,在book_spider.py中实现爬虫BooksSpider, 代码如下:
import scrapy
class BooksSpider(scrapy.Spider):
# 定义唯一标识
name = "books"
# 爬虫爬取起点网页
start_urls = [
'http://books.toscrape.com/',
]
def parse(self, response):
# 提取数据
# 每一本书的信息在中
# css()方法找到所有这样的article元素,并依次迭代
for book in response.css('article.product_pod'):
# 选择器可以通过命令行工具就行调试
# 书名信息在article>h3>a元素的title属性里
# 例 如:A Light in the...
# 书价信息在的TEXT中。
# 例如:£51.77
yield {
# xpath 语法 @ATTR 为选中为名ATTR的属性节点
'name': book.xpath('h3/a/@title').get(),
'price': book.css('p.price_color::text').get(),
}
# 检查分页
# 提取下一页的链接
#例如:next
next_url = response.css('ul.pager li.next a::attr(href)').extract_first()
if next_url:
next_url = response.urljoin(next_url)
# 构造新的 Request 对象
yield scrapy.Request(next_url, callback=self.parse)
下面对BooksSpider的实现做简单说明。
在 shell命令中运行 scrapy crawl 。
其中 SPIDER NAME 是指在代码中设置的唯一标识,例如本例中的books。