scrapy爬取豆瓣top250并插入到MySQL数据库(入门级)
scrapy爬取豆瓣top250并插入到MySQL数据库(入门级)本地安装python,去官网下载想要的版本即可,安装之后通过命令行输入python进行验证:C:\Users\jrkj-kaifa08\PycharmProjects\fzreport>pythonPython 3.7.8 (tags/v3.7.8:4b47a5b6ba, Jun 28 2020, 08:53:46) [MSC
scrapy爬取豆瓣top250并插入到MySQL数据库(入门级)
- 本地安装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.
如出现如上情景即安装成功。
- 在本地环境中安装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
如出现如上情景即安装成功。
-
在本次实验中,代码都是在PyCharm中编写,也可以去官网下载社区版,是免费的,傻瓜式安装即可。
-
接下来进入正题,开始创建项目:
(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文件中。
更多推荐
所有评论(0)