使用python的scrapy框架简单的爬取豆瓣读书top250

使用python的scrapy框架简单的爬取豆瓣读书top250

一、配置scrapy环境

1. 配置相应模块

如果没有配置过scrapy环境的一般需要安装lxml、PyOpenssl、Twisted、Pywin32、scrapy这几样模块,都可以
pip install *方式安装,如pip install lxml。

2. **测试是否安装成功 **

安装测试
直接在cmd输入scrapy,出现版本号就说明安装成功

二、爬虫项目

下面就直接开始爬取

1.创建项目scrapy startproject douban_book

创建项目
项目文件结构
这个就是创建好的scrapy文件

2.创建爬虫scrapy genspider douban_book_spider book.douban.com

“book.douban.com”是目标域
初始spider

3.明确目标

就是我们要确定我们需要爬那些目标资源(红框的是本次项目要的资源)
目标资源
然后在items.py中明确

class DoubanBookItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    # 图片链接
    img_url = scrapy.Field()
    # 书名
    book_name = scrapy.Field()
    # 书本具体信息
    specific_information = scrapy.Field()
    # 评星
    star_num = scrapy.Field()
    # 多少人评价
    people_num = scrapy.Field()
    # 描述
	describe = scrapy.Field()

4.爬虫逻辑

setting.py文件配置
user-agent
在文件添加user_agent

USER_AGENT = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:68.0) Gecko/20100101 Firefox/68.0'

编写douban_book_spider.py

class DoubanBookSpiderSpider(scrapy.Spider):
    name = 'douban_book_spider'
    allowed_domains = ['book.douban.com']
    start_urls = ['https://book.douban.com/top250']

    def parse(self, response):
        print(response.text)

测试是否有返回值
在cmd输入scrapy crawl douban_book_spider
返回值
这样说明有返回值了

在douban_book_spider.py编写xpath逻辑
定位到涵盖这页的所有书的html的地方
定位
以此为基础xpath
//div[@class=‘indent’]//table
定位二
在基础xpath下找到图片的链接
.//tr[@class=‘item’]//td//a[@class=‘nbg’]//img/@src
其他元素同理

class DoubanBookSpiderSpider(scrapy.Spider):
    name = 'douban_book_spider'
    allowed_domains = ['book.douban.com']
    start_urls = ['https://book.douban.com/top250']
    global thispage
    def parse(self, response):
        book_list = response.xpath("//div[@class='indent']//table")
        for item in book_list:
            book_item = DoubanBookItem()
            book_item['img_url'] = item.xpath(".//tr[@class='item']//td//a[@class='nbg']//img/@src").extract_first()
            book_item['book_name'] = item.xpath(".//tr[@class='item']//td[2]//div[@class='pl2']//a/@title").extract_first()
            book_item['specific_information'] = item.xpath(".//tr[@class='item']/td[2]/p[@class='pl']/text()").extract_first()
            book_item['star_num'] = item.xpath(".//tr[@class='item']/td[2]/div[@class='star clearfix']/span[2]/text()").extract_first()
            people_num = item.xpath(".//tr[@class='item']/td[2]/div[@class='star clearfix']/span[3]/text()").extract_first()
            book_item['people_num'] = people_num.replace(" ", "")
            book_item['describe'] = item.xpath(".//tr[@class='item']/td[2]/p[@class='quote']/span/text()").extract_first()
            yield book_item

每一次分页都是“后页”,最后一页就“后页”不能点击,所以可以从这里试一下
分页一
这是第一页,后页是有链接的
分页二这是最后一页,后页是没有链接的

所以判断“后页”有没有链接,如果有就回调,继续爬,没有就结束

class DoubanBookSpiderSpider(scrapy.Spider):
    name = 'douban_book_spider'
    allowed_domains = ['book.douban.com']
    start_urls = ['https://book.douban.com/top250']
    global thispage
    def parse(self, response):
        book_list = response.xpath("//div[@class='indent']//table")
        for item in book_list:
            book_item = DoubanBookItem()
            book_item['img_url'] = item.xpath(".//tr[@class='item']//td//a[@class='nbg']//img/@src").extract_first()
            book_item['book_name'] = item.xpath(".//tr[@class='item']//td[2]//div[@class='pl2']//a/@title").extract_first()
            book_item['specific_information'] = item.xpath(".//tr[@class='item']/td[2]/p[@class='pl']/text()").extract_first()
            book_item['star_num'] = item.xpath(".//tr[@class='item']/td[2]/div[@class='star clearfix']/span[2]/text()").extract_first()
            people_num = item.xpath(".//tr[@class='item']/td[2]/div[@class='star clearfix']/span[3]/text()").extract_first()
            book_item['people_num'] = people_num.replace(" ", "")
            book_item['describe'] = item.xpath(".//tr[@class='item']/td[2]/p[@class='quote']/span/text()").extract_first()
            yield book_item
       	next = response.xpath(".//div[@class='indent']/div[@class='paginator']/span[@class='next']/a/@href").extract_first()
		if next:
			yield scrapy.Request(next, callback=self.parse)

至此250本书的信息就爬下来了!

  • 1
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,下面是基于PythonScrapy框架爬取豆瓣电影的步骤: 1. 创建Scrapy项目 使用以下命令在命令行中创建新的Scrapy项目: ``` scrapy startproject douban_movie ``` 这将在当前目录下创建一个名为douban_movie的文件夹,其中包含了一个Scrapy项目的基本结构。 2. 定义Item 在Scrapy中,Item是一个Python类,用于存储从网页中提取出来的数据。在此例中,我们需要定义一个Item来存储每部电影的信息,包括电影名称、导演、主演、上映日期、评分等。 在douban_movie/spiders文件夹下创建一个名为items.py的文件,定义一个MovieItem类,代码如下: ```python import scrapy class MovieItem(scrapy.Item): name = scrapy.Field() director = scrapy.Field() actors = scrapy.Field() release_date = scrapy.Field() rating = scrapy.Field() ``` 3. 编写Spider 在Scrapy中,Spider是用于从网页中提取数据的核心组件。我们需要编写一个Spider来爬取豆瓣电影的信息。 在douban_movie/spiders文件夹下创建一个名为douban_spider.py的文件,定义一个DoubanSpider类,代码如下: ```python import scrapy from douban_movie.items import MovieItem class DoubanSpider(scrapy.Spider): name = "douban" allowed_domains = ["movie.douban.com"] start_urls = ["https://movie.douban.com/top250"] def parse(self, response): movies = response.xpath('//div[@class="hd"]') for movie in movies: item = MovieItem() item['name'] = movie.xpath('.//a/span/text()').extract_first() item['director'] = movie.xpath('.//div[@class="bd"]/p/text()[1]').\ extract_first().strip().split(":")[1] item['actors'] = movie.xpath('.//div[@class="bd"]/p/text()[1]').\ extract_first().strip().split(":")[2] item['release_date'] = movie.xpath('.//div[@class="bd"]/p/text()[2]').\ extract_first().strip().split("/")[0].strip() item['rating'] = movie.xpath('.//span[@class="rating_num"]/text()').\ extract_first() yield item ``` 在上述代码中,我们首先定义了Spider的名称、域名和起始URL。然后,在parse()方法中,我们使用XPath表达式来提取每部电影的信息,并将其存储到我们之前定义的MovieItem对象中。最后,我们使用yield关键字返回每个MovieItem对象,使其能够被后续的Pipeline组件处理。 4. 编写Pipeline 在Scrapy中,Pipeline是用于对Spider提取出的数据进行处理的组件。在此例中,我们需要编写一个Pipeline来将电影信息存储到本地文件中。 在douban_movie/pipelines文件夹下创建一个名为douban_pipeline.py的文件,定义一个DoubanPipeline类,代码如下: ```python import json class DoubanPipeline(object): def open_spider(self, spider): self.file = open('douban_movie.json', 'w', encoding='utf-8') def close_spider(self, spider): self.file.close() def process_item(self, item, spider): line = json.dumps(dict(item), ensure_ascii=False) + '\n' self.file.write(line) return item ``` 在上述代码中,我们首先在open_spider()方法中创建了一个名为douban_movie.json的文件,用于存储电影信息。然后,在close_spider()方法中关闭了该文件。最后,在process_item()方法中,我们将每个MovieItem对象转换为JSON格式,并将其写入到文件中。 5. 运行Spider 在命令行中执行以下命令,启动Spider并爬取数据: ``` scrapy crawl douban ``` Spider会自动爬取豆瓣电影Top250的页面,并将提取出来的电影信息存储到本地文件中。 至此,我们已经成功地使用Scrapy框架爬取豆瓣电影的信息。接下来,我们可以使用Python的数据可视化工具来对这些数据进行分析和展示。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值