『scrapy爬虫』02.实战豆瓣小例子(保姆级图文)

47 篇文章 16 订阅
14 篇文章 0 订阅


欢迎关注 『scrapy爬虫』 专栏,持续更新中
欢迎关注 『scrapy爬虫』 专栏,持续更新中

1. 拿到要抓取的数据

仿照前面的百度,新建豆瓣的spider

scrapy genspider 爬虫文件名 爬虫的url
scrapy genspider douban movie.douban.com

我们的目标网页是https://movie.douban.com/top250,分析网页结构,一个li代表一个电影,用选择器来定位元素,右键电影,审查元素,然后对着li右键复制Selector定位属性
在这里插入图片描述

在我们前面的每个li中,找到span,拿到class为title的span的text属性.
douban.py内容如下

import scrapy
from scrapy import Selector

class DoubanSpider(scrapy.Spider):
    name = "douban"
    allowed_domains = ["movie.douban.com"]# 限制或允许访问的域名列表
    start_urls = ["https://movie.douban.com/top250"] # 起始url

    def parse(self, response):
		myselector=Selector(text=response.text)
        # 拿到了所有的li,也就是所有的电影,每一个li代表一个电影,list_items是由250个电影li组成的list
        list_items=myselector.css("#content > div > div.article > ol > li")
        for list_item in list_items:
            # 电影标题的 Selector
            # content > div > div.article > ol > li:nth-child(1) > div > div.info > div.hd > a > span:nth-child(1)
            list_item.css("span.title::text").extract_first() # extract_first()从选择器中提取第一个匹配的数据。
            # 电影评分
            # content > div > div.article > ol > li:nth-child(1) > div > div.info > div.bd > div > span.rating_num
            list_item.css("span.rating_num::text").extract_first()  # extract_first()从选择器中提取第一个匹配的数据。
            # 电影影评
            # content > div > div.article > ol > li:nth-child(1) > div > div.info > div.bd > p.quote > span
            list_item.css("span.inq::text").extract_first()  # extract_first()从选择器中提取第一个匹配的数据。



2. 封装item类

前面拿到了数据,但是太零散了,封装类方便后续操作.

在这里插入图片描述
item.py内容如下

import scrapy
class MovieItem(scrapy.Item):
    title=scrapy.Field()
    score=scrapy.Field()
    quato=scrapy.Field()

同时,douban.py内容相互对应

import scrapy
from scrapy import Selector

from myscrapy.items import MovieItem


class DoubanSpider(scrapy.Spider):
    name = "douban"
    allowed_domains = ["movie.douban.com"]# 限制或允许访问的域名列表
    start_urls = ["https://movie.douban.com/top250"] # 起始url

    def parse(self, response):
        myselector=Selector(text=response.text)
        # 拿到了所有的li,也就是所有的电影,每一个li代表一个电影,list_items是由250个电影li组成的list
        list_items=myselector.css("#content > div > div.article > ol > li")
        for list_item in list_items:
            movie_item=MovieItem()#新建类的对象
            # 电影标题的 Selector
            # content > div > div.article > ol > li:nth-child(1) > div > div.info > div.hd > a > span:nth-child(1)
            movie_item['title']=list_item.css("span.title::text").extract_first() # extract_first()从选择器中提取第一个匹配的数据。
            # 电影评分
            # content > div > div.article > ol > li:nth-child(1) > div > div.info > div.bd > div > span.rating_num
            movie_item['score']=list_item.css("span.rating_num::text").extract_first()  # extract_first()从选择器中提取第一个匹配的数据。
            # # 电影影评
            # content > div > div.article > ol > li:nth-child(1) > div > div.info > div.bd > p.quote > span
            movie_item['quato']=list_item.css("span.inq::text").extract_first()  # extract_first()从选择器中提取第一个匹配的数据。

            yield movie_item#把整理得到的数据给管道


3. 修改一些常用的设置

包括浏览器头,并发数量,下载延迟,日志配置.

# USER_AGENT = "myscrapy (+http://www.yourdomain.com)"#告诉网站 我是爬虫,马上被枪毙~
USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
#我是好人,浏览器头

# 是否遵守爬虫协议
ROBOTSTXT_OBEY = True

#设置 Scrapy 引擎同时处理的并发请求数量。 少设置一点不要给网站太大压力! (default: 16)
CONCURRENT_REQUESTS = 8

# 随机下载延迟
RANDOMIZE_DOWNLOAD_DELAY = True
#随机延时 3秒
DOWNLOAD_DELAY = 3

#配置日志
LOG_ENABLED = False #开启日志

LOG_LEVEL = 'DEBUG'#设置日志级别。例如,要将日志级别设置为输出所有信息,可以这样配置:通过将日志级别设置为 DEBUG,你可以获取爬虫程序执行过程中的所有详细信息,包括请求、响应、数据处理等各个环节的日志输出。当然,如果你只想获取部分信息,比如只关注警告和错误信息,也可以将日志级别设置为 WARNING 或 ERROR。在运行爬虫时,Scrapy 默认会将日志输出到控制台。如果你希望将日志保存到文件中,还可以设置 LOG_FILE 配置选项,例如:

LOG_FILE = 'scrapy.log'#设置日志文件名字 上述配置会将日志输出到名为 scrapy.log 的文件中。

FEED_EXPORT_ENCODING = "utf-8"#通用编码
FEED_EXPORT_ENCODING = "gbk"#中文编码
FEED_OVERWRITE = True # 是否覆盖上次的数据,如果为false每次都是默认的在上次的csv文件后继续写入新的数据

查看日志文件
在这里插入图片描述


4. 代码运行程序生成csv

在pycharm的中断teiminal中,爬取数据并存放到csv


scrapy crawl douban -o douban.csv

csv可以改成下面任意参数
('json', 'jsonlines', 'jsonl', 'jl', 'csv', 'xml', 'marshal', 'pickle')
比如说
scrapy crawl douban -o douban.json

在这里插入图片描述
生成成功
在这里插入图片描述
在这里插入图片描述
pycharm中打开csv看到的是中文,因为默认utf8,如果你在外面用excel打开是乱码,因为你中文系统,默认用的gbk编码.

FEED_EXPORT_ENCODING = "gbk"#中文编码,可以让你外面excel打开时也是正常的

在这里插入图片描述


小结

scrapy最大优势就是你只需要负责专注数据爬取,剩下的其他下载多线程并发,数据持久化保存都交给了已经造好的轮子框架,减少工作量.


总结

大家喜欢的话,给个👍,点个关注!给大家分享更多计算机专业学生的求学之路!

版权声明:

发现你走远了@mzh原创作品,转载必须标注原文链接

Copyright 2024 mzh

Crated:2024-3-1

欢迎关注 『scrapy爬虫』 专栏,持续更新中
欢迎关注 『scrapy爬虫』 专栏,持续更新中
『未完待续』


  • 10
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
豆瓣是一个非常流行的社交网站,它包含了电影、图书、音乐等各种文化娱乐信息。本文将介绍如何使用Scrapy爬虫框架,构建一个豆瓣电影爬虫,爬取豆瓣电影排行榜中的电影信息。 1. 创建Scrapy项目 首先,我们需要创建一个Scrapy项目。在命令行中执行以下命令: ``` scrapy startproject douban ``` 这将创建一个名为douban的Scrapy项目。项目结构如下: ``` douban/ scrapy.cfg douban/ __init__.py items.py middlewares.py pipelines.py settings.py spiders/ __init__.py ``` 其中,scrapy.cfg是Scrapy的配置文件;douban文件夹是我们创建的项目名称,它包含了项目的配置、管道、中间件等设置;spiders文件夹是我们用来编写爬虫代码的地方。 2. 编写爬虫代码 在spiders文件夹中创建一个名为douban_spider.py的文件,编写如下代码: ```python import scrapy from douban.items import DoubanItem class DoubanSpider(scrapy.Spider): name = 'douban' allowed_domains = ['movie.douban.com'] start_urls = ['https://movie.douban.com/top250'] def parse(self, response): item = DoubanItem() movies = response.css('.grid_view .item') for movie in movies: item['rank'] = movie.css('.pic em::text').get() item['title'] = movie.css('.title a::text').get() item['rating'] = movie.css('.rating_num::text').get() item['quote'] = movie.css('.inq::text').get() yield item next_page = response.css('.next a::attr(href)').get() if next_page is not None: yield response.follow(next_page, self.parse) ``` 上述代码中,我们定义了一个名为DoubanSpider的爬虫类,继承自Scrapy的Spider类。我们设置了爬虫的名称、待爬取的域名和起始URL。在parse函数中,我们使用CSS选择器提取电影信息,并使用yield关键字将结果返回。同时,我们还提取了下一页的URL,并使用response.follow方法跟进到下一页。 在douban文件夹中创建一个名为items.py的文件,定义数据项: ```python import scrapy class DoubanItem(scrapy.Item): rank = scrapy.Field() title = scrapy.Field() rating = scrapy.Field() quote = scrapy.Field() ``` 3. 配置管道 在douban文件夹中的settings.py文件中,我们需要配置管道,以便将爬取的数据保存到本地文件中。 ```python ITEM_PIPELINES = { 'douban.pipelines.DoubanPipeline': 300, } FEED_FORMAT = 'json' FEED_URI = 'result.json' ``` 上述配置将数据保存为JSON格式,保存路径为result.json文件。 在douban文件夹中创建一个名为pipelines.py的文件,定义管道实现: ```python import json class DoubanPipeline(object): def __init__(self): self.file = open('result.json', 'w', encoding='utf-8') def process_item(self, item, spider): line = json.dumps(dict(item), ensure_ascii=False) + '\n' self.file.write(line) return item def close_spider(self, spider): self.file.close() ``` 上述代码实现了数据的保存功能,将数据保存为JSON格式文件。 4. 运行爬虫 在命令行中,进入douban项目的根目录,执行以下命令即可启动爬虫: ``` scrapy crawl douban ``` 爬虫会自动从豆瓣电影排行榜网页中爬取电影信息,并将结果保存到本地文件中。可以通过修改settings.py文件中的FEED_URI配置来改变保存路径。 5. 结果展示 爬虫执行完毕后,我们可以打开result.json文件查看数据结果。例如,下面是rank为1的电影信息: ```json {"rank": "1", "title": "\u8096\u7533\u514b\u7684\u6551\u8d4e", "rating": "9.7", "quote": "\u4eba\u751f\u82e6\u77ed\uff0c\u4f60\u5fc5\u987b\u559c\u6b22\u5b83\uff0c\u8fd9\u5c31\u662f\u5b83\u7684\u7f8e\u4e3d\u3002"} ``` 我们可以看到,爬虫成功地爬取了电影排行榜中的电影信息,并将结果保存到本地文件中。 6. 总结 本文介绍了如何使用Scrapy爬虫框架,构建一个豆瓣电影爬虫,爬取豆瓣电影排行榜中的电影信息。我们首先创建了一个Scrapy项目,然后编写了爬虫代码,使用CSS选择器提取电影信息,并使用管道将结果保存到本地文件中。最后,我们运行了爬虫,并查看了结果。这个例子展示了Scrapy框架的基本使用方法,希望对初学者有所帮助。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

发现你走远了

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值