文章插图
架构介绍Scrapy一个开源和协作的框架,其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的,使用它可以以快速、简单、可扩展的方式从网站中提取所需的数据 。但目前Scrapy的用途十分广泛,可用于如数据挖掘、监测和自动化测试等领域,也可以应用在获取API所返回的数据(例如 Amazon Associates Web Services ) 或者通用的网络爬虫 。
? Scrapy 是基于twisted框架开发而来,twisted是一个流行的事件驱动的Python网络框架 。因此Scrapy使用了一种非阻塞(又名异步)的代码来实现并发 。整体架构大致如下
IO多路复用
文章插图
# 引擎(EGINE)(大总管)引擎负责控制系统所有组件之间的数据流,并在某些动作发生时触发事件 。有关详细信息,请参见上面的数据流部分 。# 调度器(SCHEDULER)用来接受引擎发过来的请求, 压入队列中, 并在引擎再次请求的时候返回. 可以想像成一个URL的优先级队列, 由它来决定下一个要抓取的网址是什么, 同时去除重复的网址# 下载器(DOWLOADER)用于下载网页内容, 并将网页内容返回给EGINE,下载器是建立在twisted这个高效的异步模型上的# 爬虫(SPIDERS)SPIDERS是开发人员自定义的类,用来解析responses,并且提取items,或者发送新的请求# 项目管道(ITEM PIPLINES)在items被提取后负责处理它们,主要包括清理、验证、持久化(比如存到数据库)等操作# 两个中间件-爬虫中间件-下载中间件(用的最多,加头,加代理,加cookie,集成selenium)
安装创建和启动# 1 框架 不是 模块# 2 号称爬虫界的django(你会发现,跟django很多地方一样)# 3 安装 -mac,linux平台:pip3 install scrapy-windows平台:pip3 install scrapy(大部分人可以)- 如果失败:1、pip3 install wheel #安装后,便支持通过wheel文件安装软件,wheel文件官网:https://www.lfd.uci.edu/~gohlke/pythonlibs3、pip3 install lxml4、pip3 install pyopenssl5、下载并安装pywin32:https://sourceforge.net/projects/pywin32/files/pywin32/6、下载twisted的wheel文件:http://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted7、执行pip3 install 下载目录Twisted-17.9.0-cp36-cp36m-win_amd64.whl8、pip3 install scrapy # 4 在script文件夹下会有scrapy.exe可执行文件 -创建scrapy项目:scrapy startproject 项目名(django创建项目)-创建爬虫:scrapy genspider 爬虫名 要爬取的网站地址# 可以创建多个爬虫# 5 命令启动爬虫-scrapy crawl 爬虫名字-scrapy crawl 爬虫名字 --nolog# 没有日志输出启动 # 6 文件执行爬虫(推荐使用) -在项目路径下创建一个main.py,右键执行即可from scrapy.cmdline import execute# execute(['scrapy','crawl','chouti','--nolog'])# 没有设置日志级别execute(['scrapy','crawl','chouti'])# 设置了日志级别
配置文件目录介绍-crawl_chouti# 项目名-crawl_chouti # 跟项目一个名,文件夹-spiders# spiders:放着爬虫genspider生成的爬虫,都放在这下面-__init__.py-chouti.py # 抽屉爬虫-cnblogs.py # cnblogs 爬虫-items.py# 对比django中的models.py文件 ,写一个个的模型类-middlewares.py# 中间件(爬虫中间件,下载中间件),中间件写在这-pipelines.py# 写持久化的地方(持久化到文件,MySQL,redis,mongodb)-settings.py# 配置文件-scrapy.cfg# 不用关注,上线相关的# 配置文件settings.pyROBOTSTXT_OBEY = False# 是否遵循爬虫协议,强行运行USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/80.0.3987.149 Safari/537.36'# 请求头中的ua,去浏览器复制,或者用ua池拿LOG_LEVEL='ERROR' # 这样配置,程序错误信息才会打印, #启动爬虫直接 scrapy crawl 爬虫名就没有日志输出# scrapy crawl 爬虫名 --nolog# 配置了就不需要这样启动了# 爬虫文件class ChoutiSpider(scrapy.Spider):name = 'chouti'# 爬虫名字allowed_domains = ['https://dig.chouti.com/']# 允许爬取的域,想要多爬就注释掉start_urls = ['https://dig.chouti.com/']# 起始爬取的位置,爬虫一启动,会先向它发请求def parse(self, response):# 解析,请求回来,自动执行parser,在这个方法中做解析print('---------------------------',response)
文章插图
爬取数据,并解析
# 1 解析,可以使用bs4解析from bs4 import BeautifulSoupsoup=BeautifulSoup(response.text,'lxml')soup.find_all()# bs4解析soup.select()# css解析# 2 内置的解析器response.cssresponse.xpath# 内置解析# 所有用css或者xpath选择出来的都放在列表中# 取第一个:extract_first()# 取出所有extract()# css选择器取文本和属性:# .link-title::text# 取文本,数据都在data中# .link-title::attr(href)# 取属性,数据都在data中# xpath选择器取文本和属性# .//a[contains(@class,"link-title")/text()]#.//a[contains(@class,"link-title")/@href]# 内置css选择期,取所有div_list = response.css('.link-con .link-item')for div in div_list:content = div.css('.link-title').extract()print(content)
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- python爬取海量表情包,让你成为群里的斗图王
- 八种花茶配方解决上班族的小烦恼,花茶搭配
- 上厕所忘记带纸怎么处理?
- Linux运维遇到的基本问题解决大全
- Python+Pycharm+PyQT5可视化程序设计入门
- 到底怎么解决百度网站收录和快照更新呢?
- 金项链断了怎么修?这3种方法轻松解决
- Python初学者应避免的4个常见错误
- win10系统频繁死机如何解决
- 20年电脑老玩家,教你解决电脑卡顿问题。