scrapy爬取豆瓣top250并插入到MySQL数据库(入门级)

  1. 本地安装python,去官网下载想要的版本即可,安装之后通过命令行输入python进行验证:
C:\Users\jrkj-kaifa08\PycharmProjects\fzreport>python
Python 3.7.8 (tags/v3.7.8:4b47a5b6ba, Jun 28 2020, 08:53:46) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.

如出现如上情景即安装成功。

  1. 在本地环境中安装scrapy框架,还是在命令行中输入 pip install scrapy即可,安装之后可输入scrapy进行验证:
C:\Users\jrkj-kaifa08\PycharmProjects\fzreport>scrapy
Scrapy 2.2.0 - project: fzreport

Usage:
  scrapy <command> [options] [args]

Available commands:
  bench         Run quick benchmark test
  check         Check spider contracts
  commands
  crawl         Run a spider
  edit          Edit spider
  fetch         Fetch a URL using the Scrapy downloader
  genspider     Generate new spider using pre-defined templates
  list          List available spiders
  parse         Parse URL (using its spider) and print the results
  runspider     Run a self-contained spider (without creating a project)
  settings      Get settings values
  shell         Interactive scraping console
  startproject  Create new project
  version       Print Scrapy version
  view          Open URL in browser, as seen by Scrapy

Use "scrapy <command> -h" to see more info about a command

如出现如上情景即安装成功。

  1. 在本次实验中,代码都是在PyCharm中编写,也可以去官网下载社区版,是免费的,傻瓜式安装即可。

  2. 接下来进入正题,开始创建项目:

    (1)在电脑本地找到一个文件夹,用来存放你的python项目,在上面路径栏中cmd,回车

这样即可打开命令行,之后在命令行里面输入scrapy startproject DoubanMovie (创建一个叫DoubanMovie的项目)

d:\>scrapy startproject DoubanMovie
New Scrapy project 'DoubanMovie', using template directory 'c:\users\jrkj-kaifa08\appdata\local\programs\python\python37\lib\site-packages\scrapy\templates\project', created in:
    d:\DoubanMovie

You can start your first spider with:
    cd DoubanMovie
    scrapy genspider example example.com

然后执行 cd DoubanMovie (这里可以像在linux里面一样使用tab键进行补齐的)

进入到项目文件夹后执行 scrapy genspider douban movie.douban.com (创建一个网络爬虫在movie.douban.com基础上)

d:\>cd DoubanMovie
d:\DoubanMovie>scrapy genspider douban  movie.douban.com
Created spider 'douban' using template 'basic' in module:
  DoubanMovie.spiders.douban

(2)通过PyCharm打开创建好的项目会出现如下结构:

在这里插入图片描述
首先修改配置文件setting.py

ROBOTSTXT_OBEY = False

将原本的True改为False (是否遵守爬虫协议,学习阶段我们要改为False)

ITEM_PIPELINES = {
    'DoubanMovie.pipelines.Dou': 300,
}

还有这段代码的注释也要打开,这里的数值越低,速度越快。

(3)然后打开豆瓣电影

再按F12,可以看到所有的电影的信息都是包含在 < ol class=“grid_view”> 标签内在这里插入图片描述

因为只是做测试,所以我们只取 排名 电影名称 评分 评分人数四个字段。
在这里插入图片描述

可以看到每个电影的信息都包含在一个li标签里面 所以其xpath路径为

'//ol[@class="grid_view"]/li'

排名的信息在em标签内,其xpath为

'.//div[@class="pic"]/em/text()'

电影名称的信息在a标签下第一个span里面 其xpath为

'.//div[@class="hd"]/a/span[1]/text()'

电影评分的信息在div class=star标签下的span class="rating_num"里面 其xpath为

'.//div[@class="star"]/span[@class="rating_num"]/text()'

电影评分人数的信息在div class=star标签下的span里面 其xpath为

'.//div[@class="star"]/span/text()'

之后就可以开始写items.py

import scrapy

class DouItem(scrapy.Item):
    # define the fields for your item here like:
    # 排名
    ranking = scrapy.Field()
    # 电影名称
    movie_name = scrapy.Field()
    # 评分
    score = scrapy.Field()
    # 评论人数
    score_num = scrapy.Field()
    pass

这个地方我自己理解的话可能类似于java的bo类,打开items.py文件的时候上面会有例子,按照例子敲就可以了。

之后就是重头戏 douban.py

# -*- coding: utf-8 -*-
import scrapy
from DoubanMovie.items import DouItem


class DouSpider(scrapy.Spider):
    name = 'douban'

    # allowed_domains = ['movie.douban.com']
    def start_requests(self):
        start_urls = 'https://movie.douban.com/top250'
        yield scrapy.Request(start_urls)

    def parse(self, response):
        item = DouItem()
        movies = response.xpath('//ol[@class="grid_view"]/li')
        for movie in movies:
            item['ranking'] = movie.xpath('.//div[@class="pic"]/em/text()').extract()[0]
            item['movie_name'] = movie.xpath('.//div[@class="hd"]/a/span[1]/text()').extract()[0]
            item['score'] = movie.xpath('.//div[@class="star"]/span[@class="rating_num"]/text()').extract()[0]
            item['score_num'] = movie.xpath('.//div[@class="star"]/span/text()').re(r'(\d+)人评价')[0]  # Selector也有一种.re()
            print(item['movie_name'], "------------------------")
            yield item
        next_url = response.xpath('//span[@class="next"]/a/@href').extract()
        if next_url:
            next_url = 'https://movie.douban.com/top250' + next_url[0]
            yield scrapy.Request(next_url)

然后是连接数据库的pipelines.py
这里需要下载pymysql组件,在命令行中 执行

pip install pymysql

接下来需要创建表了 打开mysql数据库,输入如下语句,因为测试,所以就所有数据类型都设成varchar了。

create table movieTable(
	ranking				varchar(5),
	movie_name			varchar(100),
	score				varchar(10),
	score_num			varchar(10)
)

接下来是pipelines.py的代码

import pymysql
import pymysql.cursors


class Dou(object):

    def __init__(self):
        # 连接MySQL数据库
        self.connect = pymysql.connect(host='localhost', user='zds', password='zds', db='zds', port=3306)
        self.cursor = self.connect.cursor()
        print("______________数据库连接已建立")

    def process_item(self, item, Spider):
        # 往数据库里面写入数据
        print("--------------正在插入数据")
        self.cursor.execute(
            'insert into movieTable(ranking,movie_name,score,score_num)VALUES ("{}","{}","{}","{}")'.format(item['ranking'], item['movie_name'], item['score'], item['score_num']))
        self.connect.commit()
        return item

    # 关闭数据库
    def close_spider(self, Spider):
        print("============正在关闭数据库连接")
        self.cursor.close()
        self.connect.close()

所有代码写完保存后即可在命令行中执行

C:\Users\jrkj-kaifa08\PycharmProjects\DoubanMovie>scrapy crawl douban

执行完成没有报错后,去数据库查看数据 ,发现数据已经插入进来了。
在这里插入图片描述
如果想把数据存放到文件里面 则可以在命令行里面执行

C:\Users\jrkj-kaifa08\PycharmProjects\DoubanMovie>scrapy crawl douban douban.csv

这样的话,数据就会存放到当前路径下的该douban.csv文件中。

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐