前言

目标网站:http://books.toscrape.com
工具:pycharm
环境:提前安装好scrapy,没安装的可以点击这里查看教程
网站截图:books.toscrape.com
使用scrapy框架并爬取网站的1000条书本的书名和价格,保存到books.csv文件中

爬取过程

1、创建python项目
创建python项目
需要自己设置好project interpreter为安装过scrpy的interpreter
设置project interpreter
2、创建scrapy项目
点击pycharm底部的terminal命令行,输入以下命令scrapy startproject 名称:

scrapy startproject myscrapy

创建scrapy项目
3、创建一个新的spider文件
先使用cd命令进入scrapy项目下的spider文件
同样在terminal命令行中输入命令scrapy genspider 爬虫文件名 目标网址:

scrapy genspider book_scrapy books.toscrape.com

创建spider文件
4、分析目标网站
首先分析一下目标网站,可以发现书本信息都包含在<article class="product_pod">元素中
其中书名包含在h3 > a元素的title属性中
书价包含在<p class="price_color">元素的文本中。
5、编写spider文件
打开刚才创建好的book_spider.py文件,会发现文件中已经有了基本的结构。
引入了scrapy的包,创建好了一个类,里面包含了一个parse函数:
当一个页面下载完之后,Scrapy引擎会回调parse方法来解析页面,parse函数需要完成以下两个任务:
1)提取页面中的数据
2)提取页面中的链接,并产生下载请求
编写spider文件
另外在已经生成的类中,有三个属性: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

运行截图

运行1
运行2
运行3
成功爬取之后,在spider目录下可以看到生成了一个books.csv的文件,打开就可以看到1000条的书本信息:
books.csv

最后修改:2020 年 01 月 16 日
如果觉得我的文章对你有用,请随意赞赏