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

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

码农世界 2024-06-06 后端 78 次浏览 0个评论

目录

    • 1. 拿到要抓取的数据
    • 2. 封装item类
    • 3. 修改一些常用的设置
    • 4. 代码运行程序生成csv
    • 小结
    • 总结

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

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

      1. 拿到要抓取的数据

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

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

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

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

      在我们前面的每个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类

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

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

      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文件后继续写入新的数据
      

      查看日志文件

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


      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
      

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

      生成成功

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

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

      pycharm中打开csv看到的是中文,因为默认utf8,如果你在外面用excel打开是乱码,因为你中文系统,默认用的gbk编码.

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

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


      小结

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


      总结

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

      版权声明:

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

      Copyright 2024 mzh

      Crated:2024-3-1

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

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

      『未完待续』


转载请注明来自码农世界,本文标题:《『scrapy爬虫』02.实战豆瓣小例子(保姆级图文)》

百度分享代码,如果开启HTTPS请参考李洋个人博客
每一天,每一秒,你所做的决定都会改变你的人生!

发表评论

快捷回复:

评论列表 (暂无评论,78人围观)参与讨论

还没有评论,来说两句吧...

Top