前言
正则表达来提取所需要的数据的好处就在于其灵活性,可以给我们的爬虫带来很大的方便,但是其不足就是表达式很难写,需要花费一些心思去处理,需要构造出可以正确匹配我们需要的正则表达式,正则表达的符号平时对照着表来看就可以了
正则符号具体介绍和使用方法如下:
正则爬取小说内容
目标
目标地址:
https://www.qu.la/book/390/www.qu.la
然后我们需要爬下它的title
分析
我们先查看他的源码如下:
可以看到结构体系还是蛮规范的,那么爬的方法就很多了,这里主要采用正则提取方法,目的在于介绍正则表达式,比如我们需要爬的内容如下:
我们提取链接的数据信息进行分析:
<dd> <astyle=""href="/book/390/293630.html">第四十六章 暴怒的萧炎</a></dd>
<dd> <astyle=""href="/book/390/293632.html">第四十八章 斗气阁</a></dd>
也就是说我们的提取章节的信息存储在元素中的text文本中,不同的内容就是链接的根文件名,所以我们可以大致构造出正则表达:
'<dd> <a style="" href="/book/390/d+.html">(.*?)</a></dd>'
具体介绍如下:
d+:d 匹配一个数字,+ 匹配多个数字
.*?:匹配尽可能多的满足的字符,也叫贪婪匹配,其中.表示匹配单个字符 ,?匹配0次或1次,*表示匹配0次到n次
():匹配返回,小括号表示匹配括号中全部字符,如果在正则表达式中加上这个,那符合结果的会返回, d+ 没有括号,因为我们不需要那些数字,.*? 这个匹配的是标题,我们需要所以加上括号返回
请求网页
常规的requests请求,不多阐述,代码如下:
def get_html(url):
'''
请求 html
:return:
'''
headers = {
'User-Agent' : UserAgent().random
}
response = requests.get(url,headers=headers)
if response.status_code == 200:
response.encoding = 'utf-8'
return response.text
else:
return
分析数据
根据我们再4.2.2种写的正则表达式:
R= '<dd> <a style="" href="/book/390/d+.html">(.*?)</a></dd>'
titles = re.findall(r,html,re.S)
我们使用 findall 方法
r:正则表达式
html:网页源码,指的是请求网页返回的html
re.S:是一种匹配的模式,是指允许换行匹配,因为在构造正则时,网页源码可能换行了就需要它,返回的是一个列表,包含了在此 html 源码中匹配的符合的结果
代码如下:
def get_info(html):
'''
提取文章标题
:param html:
:return:
'''
pat = '<dd> <a style="" href="/book/390/d+.html">(.*?)</a></dd>'
titles = re.findall(pat,html,re.S)
for title in titles:
print(title)
小结
因为提取的内容都是比较规范的结构,所以很多复杂的情况不需要去考虑,类似中间有垃圾数据干扰我们的爬虫我们又该如何去处理,这个问题会接下来进行具体介绍,这里就先附上正则入门实例的源码:
完整代码如下:
import requests
import re
from fake_useragent import UserAgent
def get_html(url):
'''
请求 html
:return:
'''
headers = {
'User-Agent' : UserAgent().random
}
response = requests.get(url,headers=headers)
if response.status_code == 200:
response.encoding = 'utf-8'
return response.text
else:
return
def get_info(html):
'''
提取文章标题
:param html:
:return:
'''
pat = '<dd> <a style="" href=" ">(.*?)</ a></dd>'
titles = re.findall(pat,html,re.S)
for title in titles:
print(title)
if __name__ == '__main__':
'''
主接口
'''
url = 'https://www.qu.la/book/390/'
html = get_html(url)
if html == None:
print('请求失败!')
get_info(html)
欢迎大家加入人工智能圈参与交流
人工智能学习圈 - 知乎www.zhihu.com