Python3(十一) 原生爬虫
一.爬虫实例
1.原理:文本分析并提取信息——正则表达式。
2.实例目的:爬取熊猫TV某个分类下面主播的人气排行
分析网站结构
操作:F12查看HTML信息,Ctrl+Shift+C鼠标选取后找到对应的HTML。
3.步骤:
前奏:
1、明确目的(分析抓取目的确定抓取页面)
2、找到数据对应网页
3、分析网页的结构,找到数据所在标签的位置
执行:
4、模拟HTTP请求,向服务器发送请求,获取到服务器返回给我们的HTML
5、用正则表达式提取我们要的数据
......
4.代码
二. VSCode中调试代码
断点调试:F5启动,F10单步,F5跳断点,F11进内部
三.HTML结构分析基本原则
寻找到标签、标识符,使之能够定位要抓取的信息。
1、尽量选取具有唯一性的标签
2、尽量选取最接近于数据的标签
四.数据提取层级分析及原则
1.可以把两个数据看成是一组数据并再次寻找标签。
2.尽量选取可以闭合的标签(父级标签),并包裹其需要的数据
五.正则分析HTML及具体流程
'''
This is a spider,模块注释
''' from urllib import request import re class Spider(): '''
This is a spider class
''' url = 'https://www.panda.tv/cate/lol' root_pattern = '<div class="video-info">([\s\S]*?)</div>' #注意单双引号 #[\w\W] [\s\S] . 匹配所有字符 #* 匹配0次或者无限多次 #? 非贪婪模式,匹配到第一个遇到的</div> name_pattern = '</i>([\s\S]*?)</span>' number_pattern = '<span class="video-number">([\s\S]*?)</span>' def __fetch_content(self): '''
私有方法,获取网页内容
''' r = request.urlopen(Spider.url) htmls = r.read() htmls = str(htmls,encoding = 'utf-8') return htmls def __analysis(self,htmls): '''
正则表达式来提取数据
''' root_html = re.findall(Spider.root_pattern,htmls) anchors = [] for html in root_html: name = re.findall(Spider.name_pattern,html) number = re.findall(Spider.number_pattern,html) anchor = {'name':name,'number':number} anchors.append(anchor) return anchors def __refine(self,anchors): l = lambda anchor:{ 'name':anchor['name'][0].strip(), 'number':anchor['number'][0] #列表转化为单一的字符串 } return map(l,anchors) def __sort_seed(self,anchor): r = re.findall('\d*',anchor['number']) #提取数字 number = float(r[0]) if '万' in anchor['number']: #处理'万' number *= 10000 return number def __sort(self,anchors): '''
key确定比较对象
sorted()默认升序排列,reverse = True 降序
不能用str排序,要用int,并且要处理'万'
''' anchors = sorted(anchors,key = self.__sort_seed,reverse = True) return anchors def __show(self,anchors): for rank in range(0,len(anchors)): print('rank ' + str(rank + 1) + ':' + ' ' + anchors[rank]['name'] + '————' + anchors[rank]['number']) def go(self): #Spider的入口方法 htmls = self.__fetch_content() anchors = self.__analysis(htmls) anchors = list(self.__refine(anchors)) anchors = self.__sort(anchors) self.__show(anchors) spider = Spider() spider.go()
爬虫框架:
Beautiful Soup
Scrapy
Python3(十一) 原生爬虫的更多相关文章
- Python(十一) 原生爬虫
一.分析抓取目的确定抓取页面 #爬取主播人气排行 二.整理爬虫常规思路 爬虫前奏 明确目的 找到数据对应的网页 分析网页的结构找到数据所在的标签位置 模拟 HTTP 请求, 向服务器发送这个请 ...
- Python3爬虫(十一) 爬虫与反爬虫
Infi-chu: http://www.cnblogs.com/Infi-chu/ 一.重要概念 二.爬虫反爬虫进化论
- python3下scrapy爬虫(第十一卷:scrapy数据存储进mongodb)
说起python爬虫数据存储就不得不说到mongodb,现在我们来试一下scrapy操作mongodb 首先开启mongodb mongod --dbpath=D:\mongodb\db 开启服务后就 ...
- python3下scrapy爬虫(第一卷:安装问题)
一般爬虫都是用urllib包,requests包 配合正则.beautifulsoup等包混合使用,达到爬虫效果,不过有框架谁还用原生啊,现在我们来谈谈SCRAPY框架爬虫, 现在python3的兼容 ...
- Python3编写网络爬虫11-数据存储方式四-关系型数据库存储
关系型数据库存储 关系型数据库是基于关系模型的数据库,而关系模型是通过二维表保存的,所以它的存储方式就是行列组成的表.每一列是一个字段,每一行是一条记录.表可以看作某个实体的集合,而实体之间存在联系, ...
- Python3之网络爬虫<0>初级
由于Python3合并URLib与URLlib2统一为URLlib,Python3将urlopen方法放在了urllib.request对象下. 官方文档:https://docs.python.or ...
- Python3的原生协程(Async/Await)和Tornado异步非阻塞
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_113 我们知道在程序在执行 IO 密集型任务的时候,程序会因为等待 IO 而阻塞,而协程作为一种用户态的轻量级线程,可以帮我们解决 ...
- 运筹帷幄决胜千里,Python3.10原生协程asyncio工业级真实协程异步消费任务调度实践
我们一直都相信这样一种说法:协程是比多线程更高效的一种并发工作方式,它完全由程序本身所控制,也就是在用户态执行,协程避免了像线程切换那样产生的上下文切换,在性能方面得到了很大的提升.毫无疑问,这是颠扑 ...
- python3 黑板客爬虫闯关游戏(一)
这是学习python爬虫练习很好的网站,强烈推荐! 地址http://www.heibanke.com/lesson/crawler_ex00/ 第一关猜数字 很简单,直接给出代码 import ur ...
随机推荐
- Java操作Jxl实现数据交互。三部曲——《第一篇》
Java操作Jxl实现.xsl及.xsls两种数据表格进行批量导入数据到SQL server数据库. 本文实现背景Web项目:前台用的框架是Easyui+Bootstrap结合使用,需要引入相应的Js ...
- 字典 pop
1.pop(key) 删除键值对,返回value2.若字典中没有这个key,则返回None,也可以自定义3.可用作if条件判断 来源: rest framework 框架 Serializer que ...
- Serilog高级玩法之用Serilog记录所选终结点附加属性
这是该系列的第二篇文章:在ASP.NET Core 3.0中使用Serilog.AspNetCore. 第1部分-使用Serilog RequestLogging来简化ASP.NET Core的日志输 ...
- 《唐三学node.js系列》—魂士篇&&三哥初始node.js
前言 如果你有一定的前端基础,比如 HTML.CSS.JavaScript.jQuery.那么Node.js 能让你以最低的成本快速过渡成为一个全栈工程师(我称这个全栈为伪全栈,我认为的全栈也要精通数 ...
- Ceph 之RGW Cache
Overview 缓存是为达到系统快速响应的一项关键技术,Ceph 作为一个复杂的分布式存储系统,有多种.多级缓存存在.缓存按照位置分为: 客户端缓存 服务端缓存 网络中缓存 按照部署方式分为: 单体 ...
- Client API Object Model - Xrm object(3.4)
Xrm对象是全局可用的,可以在代码中使用,而不必在客户机API中使用执行上下文. Xrm 包括了以下这些namespace Xrm 的官方文档 https://docs.microsoft.com/e ...
- reactNative-解决react native使用fetch函数 Network request failed 问题
解决react native使用fetch函数Network request failed问题 最近公司新开发一个app, 用react native架构好后,用xcode模拟器打开app,对接登陆接 ...
- 牛客网在线编程_有序矩阵中第K小的元素
Leetcode378原题,所以一样没有数据范围...( log(max-min)二分答案,然后NlogN二分每一行求出小于答案的元素个数,为了保证二分的答案在矩阵中,二分写的要和平常不太一样,最后输 ...
- 【Java并发基础】局部变量是线程安全的
前言 方法中的变量(即局部变量)是不存在数据竞争(Data Race)的,也是线程安全的.为了理解为什么,我们先来了一下方法是如何被执行的,然后再分析局部变量的安全性,最后再介绍利用局部变量不会共享的 ...
- Spring-data-Jpa项目搭建
传送门:Spring Data 学习 Spring Data 开发环境搭建 Spring-data-jpa详解 简介 Spring Data是什么 Spring Data是一个用于简化数 ...