Scrapy框架--第一个爬虫项目

我使用的是Scrapy框架进行爬虫,首先我们要创建一个Scrapy项目

1
scrapy startproject <你的项目名>

首先确定一个网址爬虫专用网站

目的

爬取该网站的所有图书的书名和价格信息

了解网站

用chrome打开开发者工具,查看Elements


从这里我们可以看出每本书的信息都包裹在<article class="product_pod">元素中,其价格都在<p class="price_color">元素中,下一页的URL在ul.pager>li.next>a元素中

编写爬虫

项目名称/spiders目录下新创建一个文件book_Spider.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
import scrapy


class BooksSpider(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属性里
# .为选取当前节点,即article.product_pod
# extract_first()提取第一个匹配的元素
name = book.xpath('./h3/a/@title').extract_first()
# 使用的是css的伪元素
price = book.css('p.price_color::text').extract_first()
# price = book.xpath('./div[@class="product_price"]/p[@class="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()
next_url = response.xpath('//li[@class="next"]/a/@href').extract_first()
if next_url:
# 如果找到下一页的URL,得到绝对路径,构造新的request对象
next_url = response.urljoin(next_url)
yield scrapy.Request(next_url, callback=self.parse)

运行爬虫

  1. cd <你的项目路径>
  2. scrapy crawl <你定义的爬虫名> -o <自定义爬下来的文件名.格式>例:scrapy crawl books -o books.csv

结果

项目结构

爬下来的其中一部分内容

赏个🍗吧
0%