爬虫毕设(二):创建第一个爬虫

创建项目

使用scrapy startproject Spider创建一个名为Spider的项目。

使用vscode打开项目,可以看见该项目的文件结构:

文件结构

再一次介绍各文件的作用:

  • scrapy.cfg:项目部署文件
  • spiders:存放爬虫文件的文件夹
  • items.py:保存爬取到的数据的容器
  • middlewares.py:中间件
  • pipelines.py:将爬取的数据进行持久化存储
  • setting.py:配置文件

爬虫文件

在spiders目录下创建一个新的py文件,文件名为爬虫名,爬虫名必须是唯一的。

首先写一个爬取静态网页的爬虫。那么什么是静态网页,什么又是动态网页的?

  • 静态网页,随着HTML代码的生成,页面的内容和显示效果就基本不会发生变化的网页,除非修改网页代码。
  • 动态网页,虽然网页代码没有变,但是显示内容是随着时间、环境或者数据库操作的结果而发生改变的网页。

豆瓣的新书速递(url = 'https://book.douban.com/latest?icn=index-latestbook-all')就是一个静态网页。

在浏览器中打开开发者调试工具,进入NetWork,刷新网页,找到第一个也就是与目标url相同的请求。

查看网页请求

可以看到打开该网页时发生的网络请求与响应。选择预览,可以看到网页的预渲染。

在这里插入图片描述

可以看到我们需要的数据已经在网页上了,这就说明是静态网页。

创建一个名为douban_book的py文件。

import scrapy

class tvSpider(scrapy.Spider):
    # name是爬虫名称,它必须是唯一的
    name = "douban_book"
    allowed_domain = ["book.douban.com"]
    
    # 初始化url
    def __init__(self, *args, **kwargs):
        super(DoubanBookSpider, self).__init__(*args, **kwargs)
        self.start_urls = ["https://book.douban.com/latest?icn=index-latsetbook-all"]

    # 解析函数
    def parse(self, response):
        pass

确定了要爬取的目标网页,接下来就是要获取的自己想要的数据,这就要写解析函数parse

parse负责处理响应并必须返回一个可迭代的Request和dists或Item对象

选择器

Scrapy自己内置一套数据提取机制,成为选择器。它们通过特定的XPath或者CSS表达式来选择HTML文件中的某个部分,Scrapy选择器构建于lxml库上。

Selector对象有四个基本方法:

  • xpath(query):传入XPath表达式query,返回该表达式所对应的所有节点的selector list列表。
  • css(query):传入CSS表达式query,返回该表达式所对应的所有节点的selector list列表。
  • extract():序列化该节点为Unicode字符串并返回list列表。
  • re(regex):根据传入的正则表达式对数据进行提取,返回Unicode字符串列表。

这里使用XPath来提取数据。

快速定位

我们发现数据存储在li标签中。所以我们的思路就是先使用XPath表达式获取到所有的li标签,生成一个list,然后遍历这个list获取到每一项数据。

我们可以直接右键li标签copy到XPath表达式,但偶尔会出问题,所以我们自己写。

我们可以在代码区域按ctrl + f,然后输入自己XPath表达式验证是否正确。

获取XPath

可以看到我们写的//ul[@class="cover-col-4 clearfix"]表达式,一共获取到了20条li标签,然后我们就要通过迭代的方式来提取出每一条li标签里的数据。

Parse

我们要获取的数据有:图片、链接、书名、作者、发布时间、书籍介绍、页数、价格。

其中页数和价格需要进入详情网页进行二次解析,其他数据则可以在该页直接获取到。

我们将整个逻辑写入到parse函数中:

	def parse(self, response):
	    result = Selector(response)
        book_list = result.xpath('//*[@class="cover-col-4 clearfix"]/li')
        for book_ele in book_list:

            # 图片
            cover_url = book_ele.xpath('./a[@class="cover"]/img/@src').extract()[0
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值