精通scrapy爬虫01
初识Scrapy
安装
pip install scrapy
这里以书中的列子走了,先大概了解下
创建项目
$ scrapy startproject example
分析目标
打开页面http://books.toscrape.com,查看源码,观察书本名和价格的格式
可以看到,每一本书的信息包裹在
元素的文本中,如
£51.77
。相对URL地址,如<liclass="next">next。
实现spider
分析完页面后,接下来编写爬虫。在Scrapy中编写一个爬虫,实现一个scrapy.Spider的子类。
#@Time :2021/03/05
#@Author:Moyu
import scrapy
class BookSpider(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属性里
name = book.xpath('./h3/a/@title').extract_first()
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,得到绝对路径,构造新的Request 对象
next_url = response.urljoin(next_url)
yield scrapy.Request(next_url, callback=self.parse)
下面对BooksSpider的实现做简单说明。
● name属性
一个Scrapy项目中可能有多个爬虫,每个爬虫的name属性是其自身的唯一标识,在一个项目中不能有同名的爬虫,本例中的爬虫取名为'books'。
● start_urls属性
一个爬虫总要从某个(或某些)页面开始爬取,我们称这样的页面为起始爬取点,start_urls属性用来设置一个爬虫的起始爬取点。在本例中只有一个起始爬取点'http://books.toscrape.com'。
● parse方法
当一个页面下载完成后,Scrapy引擎会回调一个我们指定的页面解析函数(默认为parse方法)解析页面。一个页面解析函数通常需要完成以下两个任务:
- 提取页面中的数据(使用XPath或CSS选择器)。
- 提取页面中的链接,并产生对链接页面的下载请求。
页面解析函数通常被实现成一个生成器函数,每一项从页面中提取的数据以及每一个对链接页面的下载请求都由yield语句提交给Scrapy引擎。
运行爬虫
#进入项目目录
cd example
#运行爬虫
scrapy crawl books -o books.csv
#查看爬到的数据
sed -n '2,$p' books.csv | cat -n
一个简单的爬虫就完成了
在使用scrapy爬虫的时候,我们常常使用xpath来获取html标签,但是我们经常会用到提取的方法,有两种提取的方法,分别是:
extract():这个方法返回的是一个数组list,,里面包含了多个string,如果只有一个string,则返回['ABC']这样的形式。
extract_first():这个方法返回的是一个string字符串,是list数组里面的第一个字符串。
Xpath选择器:
response.selector属性返回内容相当于response的body构造了一个Selector对象。
Selector对象可以调用xpath()方法实现信息的解析提取。
在xpath()后使用extract()可以返回所有的元素结果。
若xpath()有问题,那么extract()会返回一个空列表。
在xpath()后使用extract_first()可以返回第一个元素结果。