大家好,我是安果!

提到爬虫框架,这里不得不提 Scrapy,它是一款非常强大的分布式异步爬虫框架,更加适用于企业级的爬虫!

项目地址:

https://github.com/scrapy/scrapy

本篇文章将借助一个简单实例来聊聊使用 Scrapy 编写爬虫的完整流程

1. 实战

目标对象:

aHR0cHMlM0EvL2dvLmNxbW1nby5jb20vZm9ydW0tMjMzLTEuaHRtbA==

我们需要爬取目标网站下帖子的基本信息

2-1  安装依赖

# 安装依赖
pip3 install Scrapy# Mysql
pip3 install mysqlclient

2-2  创建项目及爬虫

分析目前地址,获取网站 HOST 及爬取地址,在某个文件夹下利用命令创建一个爬虫项目及一个爬虫

# 创建一个爬虫项目
scrapy startproject cqmmgo# 打开文件夹
cd cqmmgo# 创建一个爬虫
scrapy genspider talk 网站HOST

2-3  定义 Item 实体对象

在 items.py 文件中,将需要爬取的数据定义为 Item

比如,这里就需要爬取帖子标题、作者、阅读数、评论数、贴子 URL、发布时间

# items.pyimport scrapy# 杂谈
class CqTalkItem(scrapy.Item):# 标题title = scrapy.Field()# 作者author = scrapy.Field()# 查看次数watch_num = scrapy.Field()# 评论次数comment_num = scrapy.Field()# 地址address_url = scrapy.Field()# 发布时间create_time = scrapy.Field()

2-4  编写爬虫

在 spiders 文件夹下的爬虫文件中编写具体的爬虫逻辑

通过分析发现,帖子数据是通过模板直接渲染,非动态加载,因此我们直接对 response 进行数据解析

PS:解析方式这里推荐使用 Xpath

解析完成的数据组成上面定义的 Item 实体添加到生成器中

# spiders/talk.pyimport scrapy
from cqmmgo.items import CqTalkItem
from cqmmgo.settings import talk_hour_before
from cqmmgo.utils import calc_interval_hourclass TalkSpider(scrapy.Spider):name = 'talk'allowed_domains = ['HOST']# 第1-5页数据start_urls = ['https://HOST/forum-233-{}.html'.format(i + 1) for i in range(5)]def parse(self, response):# 直接Xpath解析elements = response.xpath('//div[contains(@class,"list-data-item")]')for element in elements:item = CqTalkItem()# title = element.xpath('.//span[@class="has-businessTag"]/text()').extract_first()# title = element.xpath('.//span[@class="has-businessTag"]/text()').extract()# title = element.xpath('.//*[@class="subject"]/a').extract_first()title = element.xpath('.//*[@class="subject"]/a/@title').extract_first()author = element.xpath(".//span[@itemprop='帖子作者']/text()").extract_first()watch_num = element.xpath(".//span[@class='num-read']/text()").extract_first()comment_num = element.xpath(".//span[@itemprop='回复数']/text()").extract_first()address_url = "https:" + element.xpath('.//*[@class="subject"]/a/@href').extract_first()create_time = element.xpath('.//span[@class="author-time"]/text()').extract_first().strip()# 过滤超过设定小时之前的数据if calc_interval_hour(create_time) > talk_hour_before:continueprint(f"标题:{title},作者:{author},观看:{watch_num},评论:{comment_num},地址:{address_url},发布时间:{create_time}")item['title'] = titleitem['author'] = authoritem['watch_num'] = watch_numitem['comment_num'] = comment_numitem['address_url'] = address_urlitem['create_time'] = create_timeyield item

2-5  自定义随机 UA 下载中间件

在 middlewares.py 文件中自定义随机 User Agent 下载中间件

# middlewares.py
import random  # 导入随机模块class RandomUADownloaderMiddleware(object):def process_request(self, request, spider):# UA列表USER_AGENT_LIST = ['Opera/9.20 (Macintosh; Intel Mac OS X; U; en)','Opera/9.0 (Macintosh; PPC Mac OS X; U; en)','iTunes/9.0.3 (Macintosh; U; Intel Mac OS X 10_6_2; en-ca)','Mozilla/4.76 [en_jp] (X11; U; SunOS 5.8 sun4u)','iTunes/4.2 (Macintosh; U; PPC Mac OS X 10.2)','Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20120813 Firefox/16.0','Mozilla/4.77 [en] (X11; I; IRIX;64 6.5 IP30)','Mozilla/4.8 [en] (X11; U; SunOS; 5.7 sun4u)']# 随机生成一个UAagent = random.choice(USER_AGENT_LIST)# 设置到请求头中request.headers['User_Agent'] = agent

2-6  自定义下载管道 Pipline

在 piplines.py 文件中,自定义两个下载管道,分别将数据写入到本地 CSV 文件和 Mysql 数据中

PS:为了演示方便,这里仅展示同步写入 Mysql 数据库的方式

# piplines.pyfrom scrapy.exporters import CsvItemExporter
from cqmmgo.items import CqTalkItem
import MySQLdb  # 导入数据库模块class TalkPipeline(object):"""杂谈"""def __init__(self):self.file = open("./result/talk.csv", 'wb')self.exporter = CsvItemExporter(self.file, fields_to_export=['title', 'author', 'watch_num', 'comment_num', 'create_time', 'address_url'])self.exporter.start_exporting()def process_item(self, item, spider):if isinstance(item, CqTalkItem):self.exporter.export_item(item)return item# 关闭资源def close_spider(self, spider):self.exporter.finish_exporting()self.file.close()# 数据存入到数据库(同步)
class MysqlPipeline(object):def __init__(self):# 链接mysql数据库self.conn = MySQLdb.connect("host", "root", "pwd", "cq", charset="utf8", use_unicode=True)self.cursor = self.conn.cursor()def process_item(self, item, spider):table_name = 'talk'# sql语句insert_sql = """insert into  {}(title,author,watch_num,comment_num,address_url,create_time,insert_time) values(%s,%s,%s,%s,%s,%s,%s)  """.format(table_name)# 从item获得数据,保存为元祖,插入数据库params = list()params.append(item.get("title", ""))params.append(item.get("author", ""))params.append(item.get("watch_num", 0))params.append(item.get("comment_num", 0))params.append(item.get("address_url", ""))params.append(item.get("create_time", ""))params.append(current_date())# 执行插入数据到数据库操作self.cursor.execute(insert_sql, tuple(params))# 提交,保存到数据库self.conn.commit()return itemdef close_spider(self, spider):"""释放数据库资源"""self.cursor.close()self.conn.close()

当然,这里也可以定义一个数据去重的数据管道,通过帖子标题,对重复的数据不进行处理即可

# piplines.pyfrom scrapy.exceptions import DropItemclass DuplicatesPipeline(object):"""Pipline去重"""def __init__(self):self.talk_set = set()def process_item(self, item, spider):name = item['title']if name in self.talk_set:raise DropItem("重复数据,抛弃:%s" % item)self.talk_set.add(name)return item

2-7  配置爬虫配置文件

打开 settings.py 文件,对下载延迟时间、默认请求头、下载中间件、数据管道进行编辑

# settings.py# Obey robots.txt rules
ROBOTSTXT_OBEY = FalseDOWNLOAD_DELAY = 3# Override the default request headers:
DEFAULT_REQUEST_HEADERS = {'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9','Accept-Language': 'zh-CN,zh;q=0.9','Host': 'HOST','Referer': 'https://HOST/forum-233-1.html','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36',
}DOWNLOADER_MIDDLEWARES = {'cqmmgo.middlewares.RandomUADownloaderMiddleware': 543,'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None,
}ITEM_PIPELINES = {'cqmmgo.pipelines.TalkPipeline': 1,'cqmmgo.pipelines.MysqlPipeline': 6,'cqmmgo.pipelines.DuplicatesPipeline': 200,'cqmmgo.pipelines.CqmmgoPipeline': 300,
}# 爬取时间限制
talk_hour_before = 24

2-8 爬虫主入口

在爬虫项目根目录下创建一个文件,通过下面的方式运行单个爬虫

# main.pyfrom scrapy.cmdline import execute
import sys, osdef start():sys.path.append(os.path.dirname(__file__))# 运行单个爬虫execute(["scrapy", "crawl", "talk"])if __name__ == '__main__':start()

2. 最后

如果 Scrapy 项目中包含多个爬虫,我们可以利用 CrawlerProcess 类并发执行多个爬虫

# main.pyfrom scrapy.utils.project import get_project_settings
from scrapy.crawler import CrawlerProcess# 同时运行项目下的多个爬虫
def start():setting = get_project_settings()process = CrawlerProcess(setting)# 不运行的爬虫spider_besides = ['other']# 所有爬虫for spider_name in process.spiders.list():if spider_name in spider_besides:continueprint("现在执行爬虫:%s" % (spider_name))process.crawl(spider_name)process.start()if __name__ == '__main__':start()

当然,除了 Scrapy 外,我们也可以考虑另外一款爬虫框架 Feapder

使用方法可以参考之前写的一篇文章

介绍一款能取代 Scrapy 的爬虫框架 - feapder

推荐阅读

5 分钟,教你从零快速编写一个油猴脚本!

爬虫工具篇 - 必会用的 6 款 Chrome 插件

小技巧 | Chrome 插件如何完成剪切板的操作!

END

好文和朋友一起看~

实战 | 如何利用 Scrapy 编写一个完整的爬虫!相关推荐

  1. 利用android实现汇率计算器,利用python编写一个汇率计算器

    利用python编写一个汇率计算器 发布时间:2020-11-10 15:03:44 来源:亿速云 阅读:137 作者:Leah 这篇文章运用简单易懂的例子给大家介绍利用python编写一个汇率计算器 ...

  2. myos1 大学生利用C++构建一个完整的操作系统打印helloworld

    myos1 大学生利用C++构建一个完整的操作系统打印helloworld myos2 大学生利用C++构建一个完整的操作系统之响应键盘中断 myos3 大学生利用C++构建一个完整的操作系统之代码重 ...

  3. 利用C#编写一个水准测量近似平差程序

    一.代码界面展示 整个界面主要就是就整个界面而言,其实主要使用到的控件就是Menu,tabControl,dataGridView,richtextbox. 二.代码运算结果展示 1.导入数据 这里就 ...

  4. java 程序输出 赵_编写一个完整的JAVA的程序

    编写一个完整的JAVA的程序 关注:84  答案:1  mip版 解决时间 2021-02-05 08:43 提问者妳螚鬧俄螚笑 2021-02-05 02:59 1,接口Person Show()方 ...

  5. 利用C#编写一个高斯正反算程序

    一.代码界面展示 整个界面控件为tabControl,groupBox,label,textbox,comboBox,button,richTextBook. 二.代码运算结果展示 数据结果采用国家统 ...

  6. 使用python编写一个完整的接口自动化用例

    使用python编写一个完整的接口自动化用例 以聚合数据的 查询天气接口为例: import requestsclass HttpRequests: def __init__(self,url, pa ...

  7. 利用Python编写一个高斯正反算程序

    一.前言 这次的高斯正反算程序是使用的Python编写的. 环境信息是:Win10.PyCharm 2021.3.1.PySide6 6.3.1.Python 3.9.9,基于QT Designer设 ...

  8. 编写一个完整的python脚本

    编写一个完整的python脚本 Python脚本的格式 Python脚本的结构 创建一个项目 创建项目 创建py文件 输入脚本名称 书写python脚本内容 # coding utf-8print(& ...

  9. python数据预测_利用Python编写一个数据预测工具

    利用Python编写一个数据预测工具 发布时间:2020-11-07 17:12:20 来源:亿速云 阅读:96 这篇文章运用简单易懂的例子给大家介绍利用Python编写一个数据预测工具,内容非常详细 ...

最新文章

  1. maven(3)------maven构建web项目详细步骤
  2. 高德地图定位误差_【“怼”上了,四川景区一度建议别用高德地图】导航定位错误引用户到封闭区域,致拥堵!高德地图道歉,已更正!...
  3. vulnhub靶机获取不到ip
  4. shell分析日志常用指令合集
  5. mysql延迟复制实现
  6. 关于Spring Cloud Commons—普通抽象
  7. 使用laypage进行分页
  8. 大V怒怼银行服务太差,一怒取走500万现金!上海银行回应了
  9. 可以插卡的ipad_如何使用Mac或者ipad打电话
  10. 一个老板向员工发的牢骚
  11. java题库软件_基于JAVA题库管理系统.doc
  12. FinalData 数据恢复工具[绿色版]
  13. Python-URL编码和URL解码方法
  14. 智芯传感ZXP0电容式大气压力传感器 拓展多领域创新应用
  15. 致谢zyf2000,仅是你的备份,留念和记录学习C++的足迹
  16. 'C 语言' | 全排列解桥本分数式问题
  17. java毕业设计基于ssm框架的生鲜超市进销存管理系统
  18. [编程题]雀魂启动!(java实现)
  19. 1016 Phone Bills (25分)
  20. 【电脑办公软件有哪些】万彩办公大师教程丨PDF分割帮助文档

热门文章

  1. python实现克莱姆法则
  2. Linux环境下几种常用的文件系统
  3. 健康生活每日“8禁忌”
  4. 考研数学你必须要懂的事情
  5. mysql ibd文件一直增加_为什么 MySQL 回滚事务也会导致 ibd 文件增大?
  6. Creo 4.0 软件安装教程
  7. Casio DT930扫描软件
  8. 【笔记】设计模式 | 5种设计模式笔记整理
  9. 威力导演注册机|威力导演(Cyberlink PowerDirector)15破解工具下载
  10. 基于MatLab实现LSB(最低有效位)算法完成图片数字水印隐写功能