365Tools
发布时间:2024-03-13 23:30:02
!DOCT YPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
通过上一节《Python Scrapy爬虫框架详解》的学习,您已经对 Scrapy 框架有了一个初步的认识,比如它的组件构成,配置文件,以及工作流程。本节将通过一个的简单爬虫项目对 Scrapy 框架做进一步介绍。
首先看一个简单的示例,比如把 365工具网首页的“title”抓取下来,如下所示:
365工具网:c语言程序设计门户网站(入门教程、编程软件) ....
# 创建项目 1) scrapy startproject Title # 进入项目 2) cd Title # 创建爬虫文件 3)scrapy genspider title www.365tools.cn
import scrapy
class TitleSpider(scrapy.Spider):
name = 'title'
#要抓取数据的网站域名
allowed_domains = ['www.365tools.cn']
#第一个抓取的url,初始url,被当做队列来处理
start_urls = ['http://www.365tools.cn/']
def parse(self,response):
#.extract():提取文本内容,将列表中所有元素序列化为Unicode字符串
#.extract_first():提取列表中第1个文本内容
# 以下是我们自己编写的代码,而自动生成的代码不用改动
result = response.xpath('/html/head/title/text()').extract_first()
print('-' * 60 )
print(result)
print('-' * 60)
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',
}
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)上述过程中,我们只在 title.py 中使用 Xpath 做了解析数据的操作,就拿到了我们想要的数据。由此可见 URL 入队出队, 发起 request 请求,返回 response 响应等操作都是由 Scrapy 框架自动完成的。(referer: None) # 此处是我们要的信息 -------------------------------------------------- 365工具网:c语言程序设计门户网站(入门教程、编程软件) -------------------------------------------------- 2021-04-09 16:35:16 [scrapy.core.engine] INFO: Closing spider (finished) 2021-04-09 16:35:16 [scrapy.statscollectors] INFO: Dumping Scrapy stats: #描述Scrapy执行状态,如请求次数,时间,接受字节数等 {'downloader/request_bytes': 231, ...
在 Scrapy 框架中,每个模块之间既紧密联系,但又相互独立,这样的设计减少了代码之间耦合度,是代码简洁易懂。
scrapy startproject Maoyan100 #进入项目目录 cd Maoyan100 # 创建爬虫文件,注意url 一定要是网站域名 scrapy genspider maoyan www.maoyan.com
name = scrapy.Field() star = scrapy.Field() time = scrapy.Field()
import scrapy
from Maoyan100.items import Maoyan100Item
class Maoyan100Spider(scrapy.Spider):
# name 指定爬虫文件名字
name = 'maoyan'
allowed_domains = ['maoyan.com'] # 网站域名
start_urls = ['https://maoyan.com/board/4?offset=0'] # 第一个要抓取的url
offset = 0 #查询字符串参数
# response 为 start_urls中影响对象
def parse(self,response):
# 基准xpath,匹配电影信息的dd节点对象列表
dd_list = response.xpath('//dl[@class="board-wrapper"]/dd')
# 给items.py 中的类:Maoyan100Item()实例化
item = Maoyan100Item()
for dd in dd_list:
item['name'] = dd.xpath('./a/@title').get().strip() # 1.6以后版本使用 原来用 extract_first()
item['star'] = dd.xpath('.//p[@class="star"]/text()').get().strip()
item['time'] = dd.xpath('.//p[@class="releasetime"]/text()').get().strip()
yield item
if self.offset
4) 实现数据存储
通过编写管道文件 pipelinse.py 文件实现数据的存储,将抓取的数据存放在 MySQL 数据库,这里需要提前建库、建表,因为前面章节已经创建过,此处不再赘述。代码编写如下:
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.db.commit()
return item
# 结束存放数据,在项目最后一步执行
def close_spider(self, spider):
# close_spider()函数只在所有数据抓取完毕后执行一次,
self.cursor.close()
self.db.close()
print('执行了close_spider方法,项目已经关闭')
5) 定义启动文件
下面定义项目启动文件 run.py, 代码如下:
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
最后执行 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
{'name': '我不是药神', 'star': '主演:徐峥,周一围,王传君', 'time': '上映时间:2018-07-05'}
2021-04-09 19:38:13 [scrapy.core.scraper] DEBUG: Scraped from
{'name': '肖申克的救赎',
'star': '主演:蒂姆·罗宾斯,摩根·弗里曼,鲍勃·冈顿',
...
maoyan.csv 文件大致如下:
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(意大利)