Python爬虫-1

Python爬虫-1

Python爬虫-1

[TOC]

Python网络爬虫是什么?

网络爬虫是一种互联网信息的自动化采集程序, 主要作用是代替人工对互联网中的数据进行自动采集与整理,以快速地、批量地获取目标数据。

如下所示,是网络爬虫可以做的一些事情:

●批量采集某个领域的招聘数据,对某个行业的招聘情况进行分析

●批量采集某个行业的电商数据,以分析出具体热销商品,进行商业决策

●采集目标客户数据,以进行后续营销

●批量爬取腾讯动漫的漫画,以实现脱网本地集中浏览

●开发-款火车票抢票程序,以实现自动抢票

正则表达式基础实战

网络爬虫程序在将网页爬下来之后,其中还有一个关键的步骤就是需要对我们关注的目标信息进行提取,而表达式一般就是用于信息 筛选提取的工具。

正则表达式是一种功能强大的表达式,并且非常好用,所以建议大家掌握。

本知识点将为大家介绍正则表达式的基础,接下来将进入实战讲解。

基础1

全局匹配函数使用格式

1
re.compile(正则表达式).findall(源字符串)
表达式 匹配目标
普通字符 正常匹配
\n 匹配换行符
\t 匹配制表符
\w 匹配字母、数字、下划线
\W 匹配除字母、数字、下划线
\d 匹配十进制数字
\D 匹配除十进制数字
\s 匹配空白字符
\S 匹配除空白字符
[ab89x] 原子表,匹配 ab89x 中的任意一个
[^ab89x] 原子表,匹配除ab89x以外的任意一个字符

单个原子组合用[]可以匹配其中任意一个

实例1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import re

string = "aliyunedu"
pat = "yu"
print(re.compile(pat).findall(string)) # ['yu']

# 源字符串:"aliyun
# edu"
string2 = "aliyun\nedu"
pat2 = "yun\n"
print(re.compile(pat2).findall(string2)) # ['yun\n']

# 第一个任意字符第二个数字第三个[nedu]任意一个第四个任意数字
string3 = "aliyun89787nedu"
pat3 = "\w\d[nedu]\w"
print(re.compile(pat3).findall(string3)) # ['87ne']

基础2

表达式 匹配目标
. 匹配除换行外任意一个字符
^ 匹配开始位置(原子表内代表非)
$ 匹配结束位置
* 前一个字符出现0\1\多次
? 前一个字符出现0\1次
+ 前一个字符出现1\次
{n} 前一个字符恰好出现n次(n为数字)
{n,} 前一个字符至少n次
{n,m} 前一个字符至少n,至多m次
` `
() 模式单元:通俗的来说就是,想提取什么内容,就在正则中用小括号括起来

实例2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import re

string1 = "aliyunnnnji87362387aoyubaidu"
pat1 = "ali..."
print(re.compile(pat1).findall(string1)) # ['aliyun']

pat2 = "^li..."
print(re.compile(pat2).findall(string1)) # []

pat3 = "^ali..."
print(re.compile(pat3).findall(string1)) # ['aliyun']

pat4 = "bai..$"
print(re.compile(pat4).findall(string1)) # ['baidu']

# 默认贪婪,默认尽可能更多地进行匹配
pat5 = "ali.*"
print(re.compile(pat5).findall(string1)) # ['aliyunnnnji87362387aoyubaidu']

pat6 = "aliyun+"
print(re.compile(pat6).findall(string1)) # ['aliyunnnn']

pat7 = "aliyun?"
print(re.compile(pat7).findall(string1)) # ['aliyun']

pat8 = "yun{1,2}"
print(re.compile(pat8).findall(string1)) # ['yunn']

pat9 = "^al(i..)."
print(re.compile(pat9).findall(string1)) # ['iyu']

基础3

贪婪模式:尽可能多地匹配
懒惰模式:尽可能少的匹配,精准模式

默认贪婪模式

如果出现如下组合,则代表为懒惰模式

*?
+?

实例3

1
2
3
4
5
6
7
8
import re

string1 = "poytphonyhjskjsa"
pat1 = "p.*y"
print(re.compile(pat1).findall(string1)) # ['poytphony']

pat2 = "p.*?y"
print(re.compile(pat2).findall(string1)) # ['poy', 'phony']

基础4

模式修正符:在不改变正则表达式的情况下通过模式修正符使匹配结果发生更改

re.S 让.也可以匹配多行
re.I 让匹配时忽略大小写

案例4

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import re

string1 = "Python"

pat1 = "pyt"
print(re.compile(pat1).findall(string1)) # []

pat2 = "pyt"
print(re.compile(pat2, re.I).findall(string1)) # ['Pyt']

string2 = """我是阿里云大学
欢迎来学习
Python网络爬虫课程
"""
pat3 = "阿里.*?Python"
print(re.compile(pat3).findall(string2)) # []

pat4 = "阿里.*?Python"
print(re.compile(pat4, re.S).findall(string2)) # ['阿里云大学\n欢迎来学习\nPython']

Xpath表达式基础实战

除了正则表达式之外,还有一些非常好用的信息筛选的工具,比如XPath表达式、BeautifulSoup等等,当然,我们不可能也不需要都进行掌握,在此,我们讲解一下XPath表达式。

/逐层提取
text() 提取标签下面的文本
//标签名** 提取所有名为 * * 的标签
//标签名[@属性= '属性值']提取属性为XX的标签
@属性名代表取某个属性值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<head>
<title>
主页
</title>
</head>
<body>
<p>abc</p>
<p>bbbvb</p>
<a href="//gd.alibaba.com/go/v/pcdetail" target="_top">安全推荐</a>
<a href-"//gd.alibaba.com/go/v/pcdetail" target="_top">安全推荐2</a>
<div class="J_AsyncDC" data-type="dr">
<div id="offical-remind">明月几时有</div>
</div>
</body>

分析以下XPath表达式提取的内容:

1
2
3
4
5
/html/head/title/text() # 主页
//p/text() # abc,bbbvb
//a # 安全推荐,安全推荐2
//div[@id='offical-remind']/text() # 明月几时有
//a/@href #//gd.alibaba.com/go/v/pcdetail, //gd.alibaba.com/go/v/pcdetail

实例:

提取标题:/html/head/title/text()

提取所有div标签://div

提取所有div中<div class="tools">标签的内容://div[@class='tools']

python安装

1
2
3
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py   # 下载安装脚本
python3 get-pip.py # 运行安装脚本
pip3 install lxml

国内镜像,速度快,加后缀即可

1
-i https://pypi.tuna.tsinghua.edu.cn/simple
文章作者: HibisciDai
文章链接: http://hibiscidai.com/2020/03/11/Python爬虫-1/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 HibisciDai