初入scrapy

安装:pip install scrapy -i https://pypi:tuna.tsinghua.edu.cn/simple

测试验证安装结果:

 

 

 

创建一个项目:在shell中使用scrapyard startproject name

使用pycharm工具打开

 

1.scrapy.cfg :scrapy项目的配置文件,其内定义了项目的配置文件路径/部署相关信息等内容。

2.items.py :定义item数据结构,所有item的定义都可以放在这里。

3.pipelines :定义 item Pipeline(管道) 的实现,所有item Pipline的实现都可以放在这里。

4.settings.py: 定义项目的全局配置

5.middlewares.py:定义Spider Middlewares (spider 中间件)和Downloader Middlewares(下载中间件)的实现

6.spider:其内包含一个个Spider的实现,每个Spider都有一个文件

 实现spider:

进入项目并创建爬虫类:

scrapy genspider bookstoscrape books.toscrape.com

 

 

 

编辑bookstoscrape


import scrapy


class BookstoscrapeSpider(scrapy.Spider):
"""爬虫类,继承spider"""
#爬虫名称--每一个爬虫的唯一标识
name = 'bookstoscrape'
#允许爬爬取的域名
allowed_domains = ['books.toscrape.com']
#初始爬取的URL
start_urls = ['http://books.toscrape.com/']
#解析下载
def parse(self, response):
#提取数据
#每一本书的信息在<article class="product_pod">中,使用xpath()方法找到所有的article元素,并依次迭代
for book in response.xpath('//article[@class="product_pod"]'):
#书名信息在article>h3 >a元素的title属性中
#例如:<a href="catalogue/a-light-in-the-attic_1000/index.html" title="A Light in the Attic">A Light in the ...</a>
name = book.xpath('./h3/a/@title').extract_first()
# extract_first():这个方法返回的是一个string字符串,是list数组里面的第一个字符串。
#书价信息在article><div class="product_price">的text中,例如:<p class="price_color">£51.77</p>
price= book.xpath('./div[2]/p[1]/text()').extract_first()[1:]
#书的评级在article>p 元素的class属性中。例如:<p class="star-rating Three">
rate = book.xpath('./p/@class').extract_first().split(" ")[1]

#返回单个图书对象
yield {
"name":name,
"price":price,
"rate":rate
}
#提取下一页的链接
#下一页的url在li.next >a 元素的href属性中
#例如:<li class="next"><a href="catalogue/page-2.html">next</a></li>
next_url= response.xpath('//li[@class="next"]/a/@href').extract_first()

#判断
if next_url:
#如果找到下一页的URl,则得到绝对路径,构造新的request对象
next_url = response.urljoin(next_url)
#返回新的request对象
yield scrapy.Request(next_url,callback=self.parse

在shell中运行爬虫:scrapy crawl bookstoscrape -o bookstoscrape.csv
crawl:表示启动爬虫
bookstoscrape:在bookstoscrape.py中BookstoscrapeSpider定义的name

-o:保存文件的路径,没有这个参数也能启动爬虫,只不过数据没有保存下来而已。

bookstoscrape.csv:文件名

我使用的是导出csv格式,也可以导出json和xml格式,json:scrapy crawl bookstoscrape -o bookstoscrape.jsonlines    xml:scrapy crawl bookstoscrape -o bookstoscrape.xml

执行结果如下:

 

 使用 cat -n bookstoscrape.csv 查看:


 

 

 

总结:

遇到lxml错误:

    1. lxml.etree.XPathEvalError: Unfinished literal
      class写错了
    2. Python Xpath: lxml.etree.XPathEvalError: Invalid predicate
      class少了一个冒号闭合
posted @ 2022-05-02 23:03  安好_世界  阅读(59)  评论(0编辑  收藏  举报