Python Scrapy爬虫框架实战应用

7个月前 (04-28)
通过上一节《Python Scrapy爬虫框架详解》的学习,您已经对 Scrapy 框架有了一个初步的认识,比如它的组件构成,配置文件,以及工作流程。本节将通过一个的简单爬虫项目对 Scrapy 框架做进一步介绍。

首先看一个简单的示例,比如把 C语言中文网首页的“title”抓取下来,如下所示:

<html lang="zh-cn">

<head>

<meta charset="gb2312" />

<meta name="baidu-site-verification" content="6B13HRSfYA" />

<link rel="shortcut icon" href="/cpp/favicon.ico" />

<title>C语言中文网:c语言程序设计门户网站(入门教程、编程软件)</title>

....

</head>

创建项目

在 CMD 令行执行以下令创建项目以及爬虫文件:

# 创建项目

1) scrapy startproject Title

# 进入项目

2) cd Title

# 创建爬虫文件

3)scrapy genspider title c.biancheng网站站点" rel="nofollow" />

import scrapy

class TitleSpider(scrapy.Spider):

name = 'title'

#要抓取数据的网站域名

allowed_domains = ['c.biancheng网站站点" rel="nofollow" />

USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0.1) Gecko/20100101 Firefox/4.0.1'

ROBOTSTXT_OBEY = False

DEFAULT_REQUEST_HEADERS = {

'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',

'Accept-Language': 'en',

}

3) 使用Pycharm IDE运行项目

为了省去终端敲令的环节,您可以在项目中自定义一个运行文件 mian.py(注意:该文件与 scrapy.cfg 同目录),并编写如下代码:

from scrapy import cmdline

# 注意,cmdline.execute()是为了减少输入令的操作,该方法的参数必须为列表。

# 执行爬虫文件来启动项目

cmdline.execute('scrapy crawl title'.split())

编写完成后,执行 main.py 文件,您会看到很多的输出内容,内容大致如下:

# scrapy 框架运行时输出的日志,包含很多信息,比如版本信息,执行过程等等

2021-04-09 16:35:15 [scrapy.utils.log] INFO: Scrapy 2.5.0 started (bot: Title)

2021-04-09 16:35:15 [scrapy.utils.log] INFO: Versions: lxml 4.5.0.0, libxml2 2.9.5, cssselect 1.1.0, parsel 1.6.0, w3lib 1.22.0, Twisted

...

2021-04-09 16:35:16 [scrapy.middleware] INFO: Enabled downloader middlewares:

...

2021-04-09 16:35:16 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://c.biancheng网站站点" rel="nofollow" />

在 Scrapy 框架中,每个模块之间既紧密联系,但又相互独立,这样的设计减少了代码之间耦度,是代码简洁易懂。

猫眼电影案例

,我们使用 Scrapy 框架完成一个完整的案例:抓取猫眼电影 Top100 榜。

1) 创建项目

scrapy startproject Maoyan100

#进入项目目录

cd Maoyan100

# 创建爬虫文件,注意url 一定要是网站域名

scrapy genspider maoyan www.maoya网站站点" rel="nofollow" />

name = scrapy.Field()

star = scrapy.Field()

time = scrapy.Field()

3) 编写爬虫文件

接下来编写爬虫文件 maoyan.py 代码如下所示:

import scrapy

from Maoyan100.items import Maoyan100Item

class Maoyan100Spider(scrapy.Spider):

# name 指定爬虫文件名字

name = 'maoyan'

allowed_domains = ['maoya网站站点" rel="nofollow" />

import pymysql

from Maoyan100.settings import *

class Maoyan100Pipeline(object):

def process_item(self, item, spider):

print(item['name'], item['star'], item['time'])

return item # 多个管道有体现

# 存入mysql数据库的管道

class Maoyan100MysqlPipeline(object):

#开始

def open_spider(self, spider):

# 爬虫项目启动,执行连接数据操作

# 以下常量需要定义在settings配置文件中

self.db = pymysql.connect(

host=MYSQL_HOST,

user=MYSQL_USER,

password=MYSQL_PWD,

database=MYSQL_DB,

charset=MYSQL_CHARSET

)

self.cursor = self.db.cursor()

# 向表中插入数据

def process_item(self, item, spider):

ins = 'insert into movieinfo values(%s,%s,%s)'

L = [

item['name'], item['star'], item['time']

]

self.cursor.execute(ins, L)

self.d网站站点" rel="nofollow" />

from scrapy import cmdline

#执行爬虫文件 -o 指定输出文件的格式

cmdline.execute('scrapy crawl maoyan -o maoyan.csv'.split()) #执行项目,并且将数据存csv文件格式

注意:指定 -o 参数,可以将数据以特定的文件格式保存,比如 csv、txt、josn 等。

6) 修改配置文件

修改配置文件,主要有修改以下内容:添加日志输出、激活管道 pipelines、定义数据库常量,以及其他一些常用选项,如下所示:

#设置 robots.txt 为False

ROBOTSTXT_OBEY = False

#设置日志级别: DEBUG < INFO < WARNING < ERROR < CRITICAL

#日志需要自己添加,配置文件中没有,在空白处添加即可

LOG_LEVEL='DEBUG'

#定义日志输出文件

LOG_FILE='maoyan.log'

#设置导出数据的编码格式

FEED_EXPORT_ENCODING='utf-8'

#设置下载器延迟时间,秒为单位

DOWNLOAD_DELAY = 1

#请求头,添加useragent等信息

DEFAULT_REQUEST_HEADERS = {

'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',

'Accept-Language': 'en',

'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0.1) Gecko/20100101 Firefox/4.0.1'

}

#激活管道,并添加数据存放mysql的类,200为执行优先级

ITEM_PIPELINES = {

'Maoyan100.pipelines.Maoyan100Pipeline': 300,

# 执行数据存储mysql

'Maoyan100.pipelines.Maoyan100MysqlPipeline': 200

}

#在配置文件末尾添加mysql常用变量

MYSQL_HOST='localhost'

MYSQL_USER='root'

MYSQL_PWD='123456'

MYSQL_DB='maoyandb'

MYSQL_CHARSET='utf8'

执行 run.py 文件,日志文件 maoyan.log 内容大致如下:

2021-04-09 19:38:11 [scrapy.utils.log] INFO: Scrapy 2.5.0 started (bot: Maoyan100)

2021-04-09 19:38:11 [scrapy.utils.log] INFO: Versions: lxml 4.5.0.0, libxml2 2.9.5, cssselect 1.1.0

...

2021-04-09 19:38:13 [scrapy.core.scraper] DEBUG: Scraped from <200 https://maoya网站站点" rel="nofollow" />

name,star,time

我不是药,"主演:徐峥,周一围,王传君",上映时间:2018-07-05

肖申克的救赎,"主演:蒂姆·罗宾斯,摩根·弗里曼,鲍勃·冈顿",上映时间:1994-09-10(加拿大)

绿皮书,"主演:维果·莫腾森,马赫沙拉·阿里,琳达·卡德里尼",上映时间:2019-03-01

海上钢琴师,"主演:蒂姆·罗斯,比尔·努恩,克兰伦斯·威廉姆斯三世",上映时间:2019-11-15

小偷家族,"主演:中川雅也,安藤樱,松冈茉优",上映时间:2018-08-03

哪吒之魔童降世,"主演:吕艳婷,囧森瑟夫,瀚墨",上映时间:2019-07-26

霸王别姬,"主演:张国荣,张丰毅,巩俐",上映时间:1993-07-26

...

黑天鹅,"主演:娜塔莉·波特曼,文森特·卡索,米拉·库妮丝",上映时间:2010-09-01(意大利)