十三、原生爬虫实战

一、简单实例

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…

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

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…

机器学习实践四--正则化线性回归 和 偏差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…

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…

服务器安装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…

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

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

打包 压缩 命令tar zip

2019独角兽企业重金招聘Python工程师标准>>> 打包 压缩 命令tar zip tar语法 #压缩 tar -czvf ***.tar.gz tar -cjvf ***.tar.bz2 #解压缩 tar -xzvf ***.tar.gz tar -xjvf ***.tar.bz2 tar [主选项辅选项] 文件或目录 主选项是必须要有的&#xff0c;它告诉tar要做…

mysql免安装5.7.17_mysql免安装5.7.17数据库配置

首先要有 mysql-5.7.10-winx64环境: mysql-5.7.10-winx64 win10(64位)配置环境变量&#xff1a;1、把mysql-5.7.10-winx64放到D盘&#xff0c;进入D\mysql-5.7.10-winx64\bin目录&#xff0c;复制路径&#xff0c;配置环境变量&#xff0c;在path后面添加D\mysql-5.7.10-winx6…

tidb数据库_异构数据库复制到TiDB

tidb数据库This article is based on a talk given by Tianshuang Qin at TiDB DevCon 2020.本文基于Tianshuang Qin在 TiDB DevCon 2020 上的演讲 。 When we convert from a standalone system to a distributed one, one of the challenges is migrating the database. We’…

机器学习实践七----异常检测和推荐系统

Anomaly detection 异常检测是机器学习中比较常见的应用&#xff0c;它主要用于非监督学习问题&#xff0c;从某些角度看&#xff0c; 它又类似于一些监督学习问题。 什么是异常检测&#xff1f;来看几个例子&#xff1a; 例1. 假设是飞机引擎制造商&#xff0c; 要对引擎进行…

CODE[VS] 1621 混合牛奶 USACO

题目描述 Description牛奶包装是一个如此低利润的生意,所以尽可能低的控制初级产品(牛奶)的价格变的十分重要.请帮助快乐的牛奶制造者(Merry Milk Makers)以可能的最廉价的方式取得他们所需的牛奶.快乐的牛奶制造公司从一些农民那购买牛奶,每个农民卖给牛奶制造公司的价格不一定…

刚认识女孩说不要浪费时间_不要浪费时间寻找学习数据科学的最佳方法

刚认识女孩说不要浪费时间重点 (Top highlight)Data science train is moving, at a constantly accelerating speed, and increasing its length by adding up new coaches. Businesses want to be on the data science train to keep up with the ever-evolving technology a…

测试工具之badboy

badboy这个工具本身用处不是很大&#xff0c;但有个录制脚本的功能&#xff0c;还是jmeter脚本&#xff0c;所以针对这一点很多懒人就可以通过这个录制脚本&#xff0c;而不需要自己去编写 badboy工具最近还是2016年更新的&#xff0c;后面也没在更新了&#xff0c;官方下载地址…

hive 集成sentry

2019独角兽企业重金招聘Python工程师标准>>> 环境 apache-hive-2.3.3-bin apache-sentry-2.1.0-bin 1 2 sentry是目前最新的版本&#xff0c;支持hive的最高版本为2.3.3&#xff0c;hive版本如果高于2.3.3&#xff0c;会出一些版本兼容问题[亲测] hive快速安装 wget…

isql 测试mysql连接_[libco] 协程库学习,测试连接 mysql

历史原因&#xff0c;一直使用 libev 作为服务底层&#xff1b;异步框架虽然性能比较高&#xff0c;但新人学习和使用门槛非常高&#xff0c;而且串行的逻辑被打散为状态机&#xff0c;这也会严重影响生产效率。用同步方式实现异步功能&#xff0c;既保证了异步性能优势&#x…

什么是数据仓库,何时以及为什么要考虑一个

The term “Data Warehouse” is widely used in the data analytics world, however, it’s quite common for people who are new with data analytics to ask the above question.术语“数据仓库”在数据分析领域中被广泛使用&#xff0c;但是&#xff0c;对于数据分析新手来…