Python爬虫1-利用Scrapy抓取豆瓣电影top250数据

Python爬虫-利用Scrapy抓取豆瓣电影top250数据

简介

一段自动抓取互联网信息的程序

Python爬虫架构:

  • 调度端:用来启动、停止、和监视爬虫
  • URL管理:对等待爬取和已经爬取的URL进行管理,简单来说就是为后续模块提供可供爬取的URL
  • 网页下载器:将供爬取的URL的网页下载下来,组成供解析的字符串
  • 网页解析器:将字符串解析

scrapy抓取步骤:

  1. 新建项目 (Project) :新建一个新的爬虫项目
  2. 明确目标(Items):明确你想要抓取的目标
  3. 制作爬虫(Spider):制作爬虫开始爬取网页
  4. 存储内容(Pipeline):设计管道存储爬取内容

新建项目(抓取豆瓣电影top250数据)

打开DOM命令窗口,进入D盘(我是把新建项目文件放置在D盘),输入scrapy startproject douban,新建名称为 “douban” 的爬虫项目
新建爬虫项目

开启PyCharm查看新建的爬虫项目
查看新建的爬虫项目

新建spider 爬虫主文件

  1. 输入命令:cd douban\douban\spiders,进入spiders文件目录下
  2. 输入命令:scrapy genspider douban_spider movie.douban.com, 新建名称为“douban_spider”的文件,其中“movie.douban.com”为域名(douban_spider文件名称可以另取,该文件用于编写XPath和正则表达式
    创建douban_spider文件

  3. PyCharm上自动刷新显示新建的爬虫文件
    PyCharm显示

明确目标(明确需要抓取的网页信息)

打开items.py文件,在类 DoubanItem下定义抓取目标,代码如下:

 # -*- coding: utf-8 -*-

# Define here the models for your scraped items
#
# See documentation in:
# https://doc.scrapy.org/en/latest/topics/items.html

import scrapy

class DoubanItem(scrapy.Item):
    # define the fields for your item here like:
    # name =scrapy.Field()
    #序号
    serial_number=scrapy.Field()
    #电影名称
    movie_name=scrapy.Field()
    #电影介绍
    introdue=scrapy.Field()
    #星际
    star=scrapy.Field()
    #电影的评论数
    evaluate=scrapy.Field()
    #电影的描述
    describe=scrapy.Field()
    pass

修改setting的USER_AGENT值

  1. 进入豆瓣网页(https://movie.douban.com/top250
  2. 按F12,点击 Network ,再按F5刷新网页
  3. 点击top250,找到 User-Agent 项,复制其内容
    从浏览器获取User-Agent值
  4. 打开 settings 文件,去掉USER_AGENT这行的注释,清空原内容,粘贴上述从浏览器获取的内容
    修改settings文件里的USER_AGENT值

制作爬虫(douban_spider文件编写),代码如下:

# -*- coding: utf-8 -*-
import scrapy
from douban.items import DoubanItem

class DoubanSpiderSpider(scrapy.Spider):
    # 爬虫名字
    name = 'douban_spider'
    # 允许的域名
    allowed_domains = ['movie.douban.com']
    # 入口URL
    start_urls = ['https://movie.douban.com/top250']

    # 默认解析方法
    def parse(self, response):
        # 循环电影的条目
        movie_list = response.xpath("//div[@class='article']//ol[@class='grid_view']/li")
        for i_item in movie_list:
            # item文件导进来
            douban_item = DoubanItem()
            # 写详细的xpath,进行数据的解析
            douban_item['serial_number'] = i_item.xpath(".//div[@class='pic']//em/text()").extract_first()
            douban_item['movie_name'] = i_item.xpath(".//div[@class='info']/div[@class='hd']/a/span[1]/text()").extract_first()
            content = i_item.xpath(".//div[@class='info']/div[@class='bd']/p[1]/text()").extract()
            for i_content in content:
                # 去掉空格
                content_s = "".join(i_content.split())
                douban_item["introdue"] = content_s
            douban_item['star'] = i_item.xpath(".//span[@class='rating_num']/text()").extract_first()
            douban_item['evaluate'] = i_item.xpath(".//div[@class='star']/span[4]/text()").extract_first()
            douban_item['describe'] = i_item.xpath(".//p[@class='quote']/span/text()").extract_first()
            # 需要将数据yield到pipelines里面去
            yield douban_item
        # 解析下一页的规则,取的后一页的xpath
        next_link = response.xpath("//span[@class='next']/link/@href").extract()
        if next_link:
            next_link = next_link[0]
            yield scrapy.Request("https://movie.douban.com/top250"+next_link,callback=self.parse())

运行项目

一、通过命令运行

  1. 输入命令:cd douban\douban\spiders,进入根目录spiders文件下
  2. 输入命令:scrapy crawl douban_spider,运行spider文件
  3. 结果出现报错“SyntaxError: invalid syntax”(原因是manhole.py文件里的async字段变成了关键字,需要手动修改下名称)
  4. 解决方案:进入manhole.py文件存放目录\Python37\Lib\site-packages\twisted\conch,打开manhole.py文件,修改async为shark(也可以修改为其它名称)
  5. 再次输入命令:scrapy crawl douban_spider,运行spider文件

二、通过启动文件运行

  1. 在douban文件目录下新建启动文件 main.py (文件名称可以另取)
  2. 打开main文件,编写代码如下:

    from scrapy import cmdline
    cmdline.execute('scrapy crawl douban_spider'.split())

    这里写图片描述
    3.运行main文件,查看结果

猜你喜欢

转载自blog.csdn.net/liuwei_q/article/details/82260529