精通scrapy爬虫01

初识Scrapy

安装

pip install scrapy
这里以书中的列子走了,先大概了解下

创建项目

$ scrapy startproject example

分析目标

打开页面http://books.toscrape.com,查看源码,观察书本名和价格的格式
可以看到,每一本书的信息包裹在

元素中:书名信息在其下h3 > a元素的title属性中,如<ahref="catalogue/a-light-in-the-attic_1000/index.html"title="A Light in the Attic">A Light inthe...;书价信息在其下

元素的文本中,如

£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()可以返回第一个元素结果。

posted @ 2021-03-05 11:07  shmily墨鱼  阅读(108)  评论(0)    收藏  举报