前言
目标网站:http://books.toscrape.com
工具:pycharm
环境:提前安装好scrapy,没安装的可以点击这里查看教程
网站截图:
使用scrapy框架并爬取网站的1000条书本的书名和价格,保存到books.csv文件中
爬取过程
1、创建python项目
需要自己设置好project interpreter为安装过scrpy的interpreter
2、创建scrapy项目
点击pycharm底部的terminal命令行,输入以下命令scrapy startproject 名称:
scrapy startproject myscrapy
3、创建一个新的spider文件
先使用cd命令进入scrapy项目下的spider文件
同样在terminal命令行中输入命令scrapy genspider 爬虫文件名 目标网址:
scrapy genspider book_scrapy books.toscrape.com
4、分析目标网站
首先分析一下目标网站,可以发现书本信息都包含在<article class="product_pod">元素中
其中书名包含在h3 > a元素的title属性中
书价包含在<p class="price_color">元素的文本中。
5、编写spider文件
打开刚才创建好的book_spider.py文件,会发现文件中已经有了基本的结构。
引入了scrapy的包,创建好了一个类,里面包含了一个parse函数:
当一个页面下载完之后,Scrapy引擎会回调parse方法来解析页面,parse函数需要完成以下两个任务:
1)提取页面中的数据
2)提取页面中的链接,并产生下载请求
另外在已经生成的类中,有三个属性:name、allowed_domains、start_url
name:每个scrapy项目中会有很多爬虫文件,name是每个爬虫文件的唯一标识,在一个项目中不能存在同名的爬虫,像上面我们设置的就是book_scrapy
allowed_domain:百度了一下,说是会过滤其他的域名,但不会过滤start_url的域名,有待验证。
start_url:每个爬虫要从某个页面开始爬虫,这样的页面叫做起始爬取点。
下面是book_scrapy.py完整的代码:
# -*- coding: utf-8 -*-
import scrapy
class BookScrapySpider(scrapy.Spider):
# name属性,是自身的唯一标识,在一个项目中不能有同名的爬虫
name = 'book_scrapy'
allowed_domains = ['books.toscrape.com']
# 爬虫起始页面
start_urls = ['http://books.toscrape.com/']
# 当页面下载完之后,Scrapy引擎会回调我们制定的页面解析函数,默认即为parse函数
def parse(self, response):
# 提取数据
# 每一本书的信息在<article class="product_pod">中
for book in response.css('article.product_pod'):
# 书名信息包含在article > h3 > a元素的title属性中
name = book.xpath('./h3/a/@title').extract_first() # extract_first()只获取第一个元素
price = book.css('p.price_color::text').extract_first()
# 通过yield语句提交给Scrapy引擎
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)
# 发起新的request请求
yield scrapy.Request(next_url, callback=self.parse)
6、运行spider文件并保存数据
同样在底部打开terminal,并输入命令:scrapy crawl spider标识 参数:
scrapy crawl book_scrapy -o books.csv
运行截图
成功爬取之后,在spider目录下可以看到生成了一个books.csv的文件,打开就可以看到1000条的书本信息: