利用scrapy爬虫框架爬取书目信息

笔者是python3.6+pycharm的环境

爬取书目的网址是:http://books.toscrape.com 该网站是专门提供给爬虫初学者爬取的网站。

  • 安装scrapy:任何系统都可以使用pip安装scrapy框架
>pip install scrapy
#安装成功后查看版本信息
>scrapy version
Scrapy 1.5.1
#笔者的scrapy版本是1.5.1
  • 开始一个项目:
#命令为:scrapy startproject [SpiderName]
>scrapy startproject scrapy_books
#创建了一个名称为scrapy_books的爬虫
#查看结构,/f参数是递归显示
>tree /f scrapy_books
D:\PYTHON36\SCRAPY_BOOKS\SCRAPY_BOOKS
│  items.py
│  middlewares.py
│  pipelines.py
│  settings.py
│  __init__.py
│
├─spiders
│  │  __init__.py
│  │
│  └─__pycache__
└─__pycache__
  • 各个py文件的简单说明:

item.py:保存爬取到数据的容器。
middlewares.py:中间件,处理request对象和response对象。
pipelines.py:管道模块,处理python处理好的数据。
settings.py:scrapy爬虫的一些配置。
spiders:爬虫模块,爬取解析数据。

  • 简单的网页分析:

进入网站,打开开发者模式:
有一千本书,共分为20页
在这里插入图片描述
找到翻页按钮,审查该元素:发现有下一页的链接,注意一个问题第二页的next链接与后面的翻页链接多了catalogue这个词,写代码时应该考虑到
在这里插入图片描述
分别找到书名和价格的位置
在这里插入图片描述
在这里插入图片描述

  • 开始coding:

    • 在spiders目录下建立一个新的python文件,用于写元素筛选和url爬取代码
      在这里插入图片描述
    • 在其中添加如下代码:
     import scrapy
     from bs4 import BeautifulSoup   #将利用BeautifulSoup进行解析
     
     class BookSpiders(scrapy.Spider):   #继承Spider
         name = "BOOKS"    #这是爬虫的唯一标识
         start_urls = ["http://books.toscrape.com"]    #开始爬取的网址,必须放在start_urls中
     
         def parse(self, response):
             soup = BeautifulSoup(response.text, "html.parser", from_encoding='utf-8')
     
             one_page_books = soup.find_all('li')
             for book in one_page_books:
                 try:
                     book_title_label = book.find("h3")
                     title = (book_title_label.find('a')).get('title')   #获取书名
                     book_price_label = book.find('div', "product_price")
                     price = book_price_label.find('p', "price_color").get_text()   #获取价格
     
                     yield {'title':title,
                            'price':price,}     #提交一次结果
     
                 except Exception:
                     continue
     
             next_url = soup.find('li', 'next').find('a').get('href')
             url = "http://books.toscrape.com/catalogue/"
             if next_url:   #如果不为空,则继续爬取
                 #注意只有第二页的next_url有catague字段,故做分割
                 next_url = next_url.split("/")[-1]   #分割取末尾 即page-2.html格式
                 next_url = url + next_url   #拼接成为完整的网址
                 yield scrapy.Request(next_url,callback=self.parse)   #提交请求
    
  • 启动scrapy爬虫:

#在终端启动爬虫
>scrapy crawl books -o books.csv
#启动名为books的爬虫并将爬取的结果输出到文件books.csv中
  • 爬取效果:
    在这里插入图片描述
  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值