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

52 篇文章 18 订阅
14 篇文章 6 订阅


欢迎关注 『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爬虫』 专栏,持续更新中
『未完待续』


评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

发现你走远了

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

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

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

打赏作者

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

抵扣说明:

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

余额充值