美文网首页
Python爬虫笔记(4):利用scrapy爬取豆瓣电影250

Python爬虫笔记(4):利用scrapy爬取豆瓣电影250

作者: 坐下等雨 | 来源:发表于2018-11-10 01:47 被阅读0次

在网上阅读有关scrapy的教程也有一段时间了,可是一直没能真正写出能爬出数据的代码。。。今天趁着有点时间,赶快实战一下吧!

目标:豆瓣电影250

为啥选它呢,因为网上有关爬取豆瓣电影的教程多呀,可以很容易的复刻他人的代码,少走弯路。
可是,可是,万万没想到的是,这次的写爬虫过程中我几乎把能踩的坑全踩个遍,菜鸟的烦恼~ 。~
同时我也明白了,人家的以前写的代码,搁到现在未必全部适用。

先把写的流程过一下,然后在慢慢填坑。

至于详细的教程可以参考scrapy中文网

  1. 首先,打开cmd,切换到你希望的路径中,启动项目
scrapy startproject douban
  1. 打开pycharm,找到所在的项目的文件夹并打开,如图


    图1.png
  2. 在items.py填写代码如下
import scrapy


class DoubanItem(scrapy.Item):
    ranking = scrapy.Field() # 排名
    name = scrapy.Field() #电影名称
    score = scrapy.Field() #得分
    people_mun = scrapy.Field() #评价人数
    introduction = scrapy.Field() #电影简介
  1. 在spiders文件夹下创建douban_spider.py文件,然后填写代码如下
import scrapy
from douban.items import DoubanItem


class DoubanSpiderSpider(scrapy.Spider):
    name = 'douban_spider' #定义爬虫的名字
    start_urls = ['https://movie.douban.com/top250?start=0&filter='] #爬取的起始页

#定义解析函数,用来解析返回的response对象
    def parse(self, response):
        #用xpath选择器提取数据
        infos = response.xpath("//ol[@class='grid_view']/li")
        for info in infos:
            ranking = info.xpath(".//div[@class='pic']/em/text()").get()
            name = info.xpath(".//div[@class='hd']/a/span[1]/text()").get()
            score = info.xpath(".//div[@class='star']/span[2]/text()").get()
            people_mun = info.xpath(".//div[@class='star']/span[4]/text()").get()
            introduction = info.xpath(".//p[@class='quote']/span/text()").get()
            item = DoubanItem(ranking=ranking, name=name, score=score, people_mun=people_mun, introduction=introduction)
            yield item
        next_url = response.xpath("//span[@class='next']/a/@href").get() #获取下一页链接

        if not next_url:
            return
        else:
            next_url = 'https://movie.douban.com/top250'+next_url #将获取的下一页链接拼接完整
            yield scrapy.Request(next_url, callback=self.parse) #将提取的URL返回给解析函数
  1. 最后在所在项目的文件夹下运行power shell,输入如下
scrapy crawl douban_spider -o douban.csv

scrapy就会自动将提取的数据保存到CSV文件当中去。

可是现实往往没有那么美好,下面就是我开始填坑的辛苦路程了。。。

  • 首先,返回的是403还是什么的,弄得我一脸懵逼,什么鬼,网不好吗?
    突然间,我灵光一闪,凭着那仅有的一丢丢经验,headers浮现在了脑海当中。
    headers是放在哪里的?settings.py!
  • 好了终于有数据了!心里一阵激动,mmp,怎么只有前25条电影数据?
    眼尖的我发现了这个
    图2.png
    还好我看过scrapy中文网中的采花大盗教程,跟着在Middleware中设置一遍
 def process_request(self, request, spider):
        referer = request.url
        if referer:
            request.headers['Referer'] = referer

然后再在settings里面启动middleware


图3.png

但是应该打开的是红箭头所示的,而不是绿箭头的,这又是一个坑,自己没动脑子就踩上去了。。。

  • 其实除了这些还有很多磕磕绊绊呢,像是我没有拼接next_url,start_url设置成了‘https://movie.douban.com/top250’,自作聪明的添加了allowed_domains导致爬取出错。。。都是泪啊~~~

最后贴上第一个scrapy爬到的成果吧


图4.png

作为一个全靠自己摸索前进的菜鸟的学习之路,就是一个踩坑填坑的过程,但是当你踩的坑多了,那说明,你浪费的时间也就多了! _ !

相关文章

网友评论

      本文标题:Python爬虫笔记(4):利用scrapy爬取豆瓣电影250

      本文链接:https://www.haomeiwen.com/subject/clhexqtx.html