十三、原生爬虫实战

一、简单实例

1、需求:爬取熊猫直播某类主播人气排行

2、了解网站结构

分类——英雄联盟——"观看人数"

3、找到有用的信息

二、整理爬虫常规思路

1、使用工具chrome——F12——element——箭头——定位目标元素

目标元素:主播名字,人气(观看人数)

 

2、方法:使用正则表达式提取有用的信息

主播名字,人气(观看人数)

总结

  • 爬虫前奏

1)明确目的

2)找到数据对应的网页

3)分析网页的结构找到数据所在的标签位置

  • 步骤

1)模拟HTTP请求,向服务器发送这个请求,获取到服务器返回给我们的HTML

2)用正则表达式提取我们要的数据(名字,人气)

二、断点调试

我们以如下的一种常见错误,来演示如何通过PyCharm断点追踪的方式发现程序中的错误:

def foo(bar=[]):bar.append('bar') return bar >>>foo() ['bar'] >>>foo() ['bar', 'bar'] >>>foo() ['bar', 'bar', 'bar']

这里存在一个常见的错误就是误以为:函数在每次不提供可选形参时将参数设置为默认值,也就是本例中的[],一个空的list。

这里我们便可以通断点调试的方式进行追踪,在每次函数调用(不显示传递形参)时,观察形参值的变化。
如图所示为:


这里写图片描述

下图是以这段为例,来演示如何发现程序中的bug:

这里写图片描述

解决方案:

def foo(bar=None):if not bar: bar = [] bar.append('baz') return bar >>>foo() ['baz'] >>>foo() ['baz']

三、HTML结构分析基本原则

1、爬虫分析,最重要的一步,找到标签(即左右边界)

原则:

1)尽量选择有唯一标识性的标签

2)尽量选择离目标信息最近的标签

不同人选择的标签可能不同。

 

四、数据提取层级及原则

1、找到最近的定位标签(肉眼可见)

有关联的信息作为一组,找离这一组最近的定位标签

如:示例中的“主播姓名”和“人数”是有关联的,作为一组

2、判断选择的标签是否是唯一的(需代码验证)

3、尽量选择可闭合的定位标签

 

可闭合,是指可将目标信息包裹起来的定位标签。如:<... />

 

 

4、代码实战

 1 # coding=utf-8
 2 import re  3 from urllib import request  4  5 url = 'https://www.panda.tv/all'  6 r = request.urlopen(url)  7 htmls = r.read()  8  9 print(type(htmls)) # 打印type,结果是bytes类型 10 htmls = str(htmls, encoding='utf-8') # 将bytes转成utf-8 11 print(htmls)

运行结果

Traceback (most recent call last):File "E:/pyClass/thirtheen/spider.py", line 12, in <module>print(htmls) UnicodeEncodeError: 'gbk' codec can't encode character '\xa0' in position 62321: illegal multibyte sequence

原因是使用的print()是win7系统的编码,但是win7系统的默认编码是GBK,解决方式,增加如下代码

1 import io
2 import sys 3 sys.stdout=io.TextIOWrapper(sys.stdout.buffer,encoding='gb18030')

优化后代码

# coding=utf-8
import re
from urllib import request
import io
import sys
sys.stdout=io.TextIOWrapper(sys.stdout.buffer,encoding='gb18030')class Spider():url = 'https://www.panda.tv/all'def __fetch_content(self):r = request.urlopen(Spider.url)htmls = r.read()htmls = str(htmls, encoding='utf-8')  # 将bytes转成utf-8print(htmls)return htmlsdef go(self):self.__fetch_content()spider=Spider()
spider.go()

 

五、正则分析HTML

1、获取root_html

正则表达式匹配<div class="video-info">和</div>之间的所有字符,有哪些方式?

匹配所有字符的方式

1)[\s\S]*?

2)[\w\W]*?

* 表示任意次

?表示贪婪

2、代码实战

 

 1 # coding=utf-8
 2 from urllib import request
 3 import re
 4 import io
 5 import sys
 6 sys.stdout=io.TextIOWrapper(sys.stdout.buffer,encoding='gb18030')
 7 
 8 #以下代码解决SSL报错
 9 import ssl
10 ssl._create_default_https_context = ssl._create_unverified_context
11 
12 
13 class Spider():
14 
15     #定义类变量
16     url = 'https://www.panda.tv/all'
17     root_html='<div class="video-info">([\s\S]*?)</div>'  #([\s\S]*?)匹配任意字符
18 
19     #获取服务器响应内容
20     def __fetch_content(self):
21 
22         r=request.urlopen(url=Spider.url)
23         htmls = r.read()
24         htmls = str(htmls, encoding='utf-8')  # 将bytes转成utf-8
25         return htmls
26 
27     #分析并获取元素
28     def __analysis(self,htmls):
29         root_html=re.findall(Spider.root_html,htmls)
30         return root_html
31 
32 
33     def go(self):
34         htmls=self.__fetch_content()
35         self.__analysis(htmls)
36 
37 
38 spider=Spider()
39 spider.go()

遇到的问题:

1)乱码

参考python的编码问题整理

2)SSL错误

加入如下代码

import ssl
ssl._create_default_https_context = ssl._create_unverified_context

 

3)类变量的引用

Spider.root_html

六、数据精炼

正则分析获取名字和人数

1、找到名字的左右边界、找到人数的左右边界

2、使用正则匹配,从root_html中获取名字和人数,并拼接成字典格式,列表接收

3、数据精炼——去掉多余的换行和空格(如果有),将value列表转化为str

代码示例:

 1 # coding=utf-8
 2 from urllib import request
 3 import re
 4 import io
 5 import sys
 6 
 7 sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='gb18030')
 8 
 9 # 以下代码解决SSL报错
10 import ssl
11 
12 ssl._create_default_https_context = ssl._create_unverified_context
13 
14 
15 class Spider():
16     # 定义类变量
17     url = 'https://www.panda.tv/all'
18     root_html = '<div class="video-info">([\s\S]*?)</div>'  # ([\s\S]*?)匹配任意字符
19     name_pattern = '<span class="video-title" title="([\s\S]*?)">'
20     number_pattern = '<span class="video-number">([\s\S]*?)</span>'
21 
22     # 获取服务器响应内容
23     def __fetch_content(self):
24         r = request.urlopen(url=Spider.url)
25         htmls = r.read()
26         htmls = str(htmls, encoding='utf-8')  # 将bytes转成utf-8
27         return htmls
28 
29     # 分析并获取元素
30     def __analysis(self, htmls):
31         anchors = []  # 使用list接收
32         root_html = re.findall(Spider.root_html, htmls)
33         for html in root_html:
34             name = re.findall(Spider.name_pattern, html)
35             number = re.findall(Spider.number_pattern, html)
36             anchor = {'name': name, 'number': number}  # 组合成需要的字典格式
37             anchors.append(anchor)
38 
39         return anchors
40 
41     # 数据精炼——去掉多余的内容,转成需要的格式
42     def __refine(self, anchors):
43         l = lambda anchor: {'name': anchor['name'][0], 'number': anchor['number'][0]}  # 上一步得到的name和number是列表类型,需要转成str
44         return map(l, anchors)
45 
46 
47     def go(self):
48         htmls = self.__fetch_content()
49         anchors = self.__analysis(htmls)
50         anchors=list(self.__refine(anchors))
51         print(anchors)
52 
53 
54 spider = Spider()
55 spider.go()

九、业务处理——排序

 

转载于:https://www.cnblogs.com/loveapple/p/9408611.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/388949.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

归一化 均值归一化_归一化折现累积收益

归一化 均值归一化Do you remember the awkward moment when someone you had a good conversation with forgets your name? In this day and age we have a new standard, an expectation. And when the expectation is not met the feeling is not far off being asked “w…

sqlserver垮库查询_Oracle和SQLServer中实现跨库查询

一、在SQLServer中连接另一个SQLServer库数据在SQL中&#xff0c;要想在本地库中查询另一个数据库中的数据表时&#xff0c;可以创建一个链接服务器&#xff1a;EXEC master.dbo.sp_addlinkedserver server N别名, srvproductN库名,providerNSQLOLEDB, datasrcN服务器地址EXEC…

Angular2+ typescript 项目里面用require

在typescript里面怎么使用require方法呢&#xff1f; const jQuery require(jquery); const fip require( fonticonpicker/fonticonpicker )( jQuery ); 如果什么都不做&#xff0c;直接在项目里面使用&#xff0c;会得到以下错误&#xff1a; Cannot find name require 以下…

机器学习实践三---神经网络学习

Neural Networks 在这个练习中&#xff0c;将实现神经网络BP算法,练习的内容是手写数字识别。Visualizing the data 这次数据还是5000个样本&#xff0c;每个样本是一张20*20的灰度图片fig, ax_array plt.subplots(nrows10, ncols10, figsize(6, 4))for row in range(10):fo…

Microsoft Expression Blend 2 密钥,key

Microsoft Expression Blend 2 密钥&#xff0c;key&#xff0c;序列TJ2R3-WHW22-B848T-B78YJ-HHJWJ号

ethereumjs/ethereumjs-common-3-test

查看test能够让你更好滴了解其API文档的使用 ethereumjs-common/tests/chains.js const tape require(tape) const Common require(../index.js)tape([Common]: Initialization / Chain params, function (t) {t.test(Should initialize with chain provided, function (st) …

mysql修改_mysql修改表操作

一&#xff1a; 修改表信息1.修改表名alter table test_a rename to sys_app;2.修改表注释alter table sys_application comment 系统信息表;二&#xff1a;修改字段信息1.修改字段类型和注释alter table sys_application modify column app_name varchar(20) COMMENT 应用的名…

机器学习实践四--正则化线性回归 和 偏差vs方差

这次实践的前半部分是&#xff0c;用水库水位的变化&#xff0c;来预测大坝的出水量。 给数据集拟合一条直线&#xff0c;可能得到一个逻辑回归拟合&#xff0c;但它并不能很好地拟合数据&#xff0c;这是高偏差&#xff08;high bias&#xff09;的情况&#xff0c;也称为“欠…

深度学习 推理 训练_使用关系推理的自我监督学习进行训练而无需标记数据

深度学习 推理 训练背景与挑战&#x1f4cb; (Background and challenges &#x1f4cb;) In a modern deep learning algorithm, the dependence on manual annotation of unlabeled data is one of the major limitations. To train a good model, usually, we have to prepa…

Android strings.xml中定义字符串显示空格

<string name"str">字 符 串</string> 其中 就表示空格。如果直接在里面键入空格&#xff0c;无论多少空格都只会显示一个。 用的XML转义字符记录如下&#xff1a; 空格&#xff1a; <string name"out_bound_submit">出 库</strin…

WCF开发入门的六个步骤

在这里我就用一个据于一个简单的场景&#xff1a;服务端为客服端提供获取客户信息的一个接口读取客户信息&#xff0c;来完成WCF开发入门的六个步骤。 1. 定义WCF服务契约 A. 项目引用节点右键添加引用。 B. 在代码文件里&#xff0c;添加以下命名空间的引…

LOJ116 有源汇有上下界最大流(上下界网络流)

考虑有源汇上下界可行流&#xff1a;由汇向源连inf边&#xff0c;那么变成无源汇图&#xff0c;按上题做法跑出可行流。此时该inf边的流量即为原图中该可行流的流量。因为可以假装把加上去的那些边的流量放回原图。 此时再从原来的源向原来的汇跑最大流。超源超汇相关的边已经流…

CentOS 7 使用 ACL 设置文件权限

Linux 系统标准的 ugo/rwx 集合并不允许为不同的用户配置不同的权限&#xff0c;所以 ACL 便被引入了进来&#xff0c;为的是为文件和目录定义更加详细的访问权限&#xff0c;而不仅仅是这些特别指定的特定权限。 ACL 可以为每个用户&#xff0c;每个组或不在文件所属组中的用…

机器学习实践五---支持向量机(SVM)

之前已经学到了很多监督学习算法&#xff0c; 今天的监督学习算法是支持向量机&#xff0c;与逻辑回归和神经网络算法相比&#xff0c;它在学习复杂的非线性方程时提供了一种更为清晰&#xff0c;更强大的方式。 Support Vector Machines SVM hypothesis Example Dataset 1…

作为微软技术.net 3.5的三大核心技术之一的WCF虽然没有WPF美丽的外观

作为微软技术.net 3.5的三大核心技术之一的WCF虽然没有WPF美丽的外观 但是它却是我们开发分布式程序的利器 但是目前关于WCF方面的资料相当稀少 希望我的这一系列文章可以帮助大家尽快入门 下面先介绍一下我的开发环境吧 操作系统&#xff1a;windows vista business版本 编译器…

服务器安装mysql_阿里云服务器上安装MySQL

关闭防火墙和selinuxCentOS7以下&#xff1a;service iptables stopsetenforce 0CentOS7.xsystemctl stop firewalldsystemctl disable firewalldsystemctl status firewalldvi /etc/selinux/config把SELINUXenforcing 改成 SELINUXdisabled一、安装依赖库yum -y install make …

在PyTorch中转换数据

In continuation of my previous post ,we will keep on deep diving into basic fundamentals of PyTorch. In this post we will discuss about ways to transform data in PyTorch.延续我以前的 发布后 &#xff0c;我们将继续深入研究PyTorch的基本原理。 在这篇文章中&a…

「网络流24题」试题库问题

传送门&#xff1a;>Here< 题意&#xff1a;有K种类型的共N道试题用来出卷子&#xff0c;要求卷子须有M道试题。已知每道题属于p种类型&#xff0c;每种类型的试题必须有且仅有k[i]道。现问出这套试卷的一种具体方案 思路分析 昨天打了一天的Dinic&#xff0c;今天又打了…

机器学习实践六---K-means聚类算法 和 主成分分析(PCA)

在这次练习中将实现K-means 聚类算法并应用它压缩图片&#xff0c;第二部分&#xff0c;将使用主成分分析算法去找到一个脸部图片的低维描述。 K-means Clustering Implementing K-means K-means算法是一种自动将相似的数据样本聚在一起的方法,K-means背后的直观是一个迭代过…

航海家软件公式全破解

水手突破 上趋势:MA(LOW,20)*1.2,color0080ff,linethick2;次上趋势:MA(LOW,20)*1.1,COLORYELLOW;次下趋势:MA(HIGH,20)*0.9,COLORWHITE;下趋势:MA(HIGH,20)*0.8,COLORGREEN,linethick2;ZD:(C-REF(C,1))/REF(C,1)*100;HDZF:(HHV(H,20)-C)/(HHV(H,20)-LLV(L,20));趋势强度:IF(C&g…