编写第一个scrapy爬虫
来吧!小伙伴们开始我们的第一个scrapy项目。
按照工作项目的流程,先明确一下我们的项目需求。
项目需求
一个菜鸟专用的爬虫训练网站(http://books.toscrape.com),我们可以在这个网站上获取书籍的信息。
页面图创建项目
首先,创建一个scrapy项目,在shell中使用scrapy startproject 命令:
项目创建 项目文件分析页面内
分析页面是编写爬虫程序之前的重要准备,当然页面分析结束后,一切问题也就迎刃而解。
我们选用Chrome浏览器的开发这工具(Tools-Developer tools)分析页面。
1、数据信息
进入页面,单击右键‘检查’,查看HTML代码,
页面源代码可以看到每一本书的信息包裹在<article class="product_pod">元素中:书中信息在其下后h3>a元素的title属性中,如<a href="catalogue/a-light-in-the-attic_1000/index.html" title="A Light in Attic">A Light in the ...<a>; 书价信息在其下<p class="price_color">元素的文本中,如<p class="price_color">£51.77</p>
2、链接信息
可以通过单击next按钮访问下一页,选中页面下方的next按钮,查看HTML代码。
下一页链接可以看出下一页的URL在ul.pager > li.next > a元素的属性中,是一个相对URL地址,如:
<li class="next"><a href="catalogue/page-2.html">next</a></li>。
3、实现spider
分析完页面后,接下来进行编写爬虫。在Scrapy中编写爬虫,实现一个scrapy.Spider的子类。
在bookinfo/spiders 目录下,在该目录下创建新文件book_spider.py。然后,在book_spider.py
中实现爬虫bookspider,代码如下:
#encoding:utf-8
import scrapy
class BookSpider(scrapy.Spider):
#每一个爬虫的唯一标识符
name ='books'
#定义爬虫爬取的起始点,起始点可以是多个
start_urls = ['http://books.toscrape.com/']
def parse(self,response):
#提取数据
for bookin response.css('article.product_pod '):
name = book.xpath("./h3/a/@title").extract_first()
price = book.css('p.price_color::text').extract_first()
yield {
'name':name,
'price':price,
}
#提取下一页链接
next_url = response.css('ul.pager li.next a::attr(href)').extract_first()
if next_url:
#如果找到下一页的URL,得到绝对路径,构造新的Request对象
next_url = response.urljoin(next_url)
yield scrapy.Request(next_url,callback=self.parse)
在控制窗口执行
$scrapy crawl books -o books.csv
执行爬虫‘books’,并将爬去的数据存储到csv文件中。
如图获取的结果: