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))
string2 = "aliyun\nedu" pat2 = "yun\n" print(re.compile(pat2).findall(string2))
string3 = "aliyun89787nedu" pat3 = "\w\d[nedu]\w" print(re.compile(pat3).findall(string3))
|
基础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))
pat2 = "^li..." print(re.compile(pat2).findall(string1))
pat3 = "^ali..." print(re.compile(pat3).findall(string1))
pat4 = "bai..$" print(re.compile(pat4).findall(string1))
pat5 = "ali.*" print(re.compile(pat5).findall(string1))
pat6 = "aliyun+" print(re.compile(pat6).findall(string1))
pat7 = "aliyun?" print(re.compile(pat7).findall(string1))
pat8 = "yun{1,2}" print(re.compile(pat8).findall(string1))
pat9 = "^al(i..)." print(re.compile(pat9).findall(string1))
|
基础3
贪婪模式:尽可能多地匹配
懒惰模式:尽可能少的匹配,精准模式
默认贪婪模式
如果出现如下组合,则代表为懒惰模式
*?
+?
实例3
1 2 3 4 5 6 7 8
| import re
string1 = "poytphonyhjskjsa" pat1 = "p.*y" print(re.compile(pat1).findall(string1))
pat2 = "p.*?y" print(re.compile(pat2).findall(string1))
|
基础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))
string2 = """我是阿里云大学 欢迎来学习 Python网络爬虫课程 """ pat3 = "阿里.*?Python" print(re.compile(pat3).findall(string2))
pat4 = "阿里.*?Python" print(re.compile(pat4, re.S).findall(string2))
|
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
|