爬虫基础:使用正则匹配获取网页中的指定内容

本文以爬取国家地理中文网中的旅行类中的图片为例,演示爬虫具备的基本功能。

给定初始地址

国家地理中文网 : http://www.ngchina.com.cn/travel/

获取并分析网页内容

a、分析网页结构,确定想要的内容部分

我们打开网页,右击选择《显示网页源代码》查看网页结构,下面是我截取的部分

分析网页源码

我们会发现,图片类型的数据都放在< img >标签 的scr=”“内,我们只要找出这些标签,从中提取我们想要的连接即可完成我们的预期。

b、获取网页内容

想要提取内容,首先我们要向该服务器发起请求,拿取该文件,然后分析提取其中的图片信息,并整理保存数据

笔者使用的Python3.6,获取网页内容常用的有两种方式:requests和urllib(合并了python2中的urllib和urllib2),关于获取网页内容,请参考这篇:爬虫基础:python获取网页内容

现在,我们定义一个用来获取网页的方法 crawl()

import requests
def crawl(url, headers):
    with requests.get(url=url, headers=headers) as response:
        # 读取response里的内容,并转码
        data = response.content.decode()
        return data

调用该方法获取网页内容:

# 获取指定网页内容
url = 'http://www.ngchina.com.cn/travel/'
headers = {'User-Agent':'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Mobile Safari/537.36'}

content = crawl(url, headers)
print(content)

编写正则表达式,匹配图片内容

import re
# 编写正则表达式,匹配图片内容
pattern = r'src="(.*?\.jpg)'
complie_re = re.compile(pattern)
# 匹配所有符合正则表达式的内容
imgList = complie_re.findall(content)

# 针对匹配出来的内容,可能需要进一步处理、筛选才能最终得到我们需要的数据,例如新的link,我们可以去重之后放入到新的url队列中去,等待下一次抓取
# 总之,根据需求来处理

# 去重
imgList = list(set(imgList))

# 去除不合格的图片
imgList = [img for img in imgList if img.startswith('http')]

# 输出
for img, i in zip(imgList, range(len(imgList))):
    print('{}:{}'.format(i, img))

'''
0:http://image.ngchina.com.cn/2018/0428/20180428110510703.jpg
1:http://image.ngchina.com.cn/2018/0130/20180130032001381.jpg
2:http://image.ngchina.com.cn/2018/0424/20180424010923371.jpg
.
.
.
37:http://image.ngchina.com.cn/2018/0419/20180419014117124.jpg
38:http://image.nationalgeographic.com.cn/2017/1127/20171127121516360.jpg
'''

这样我们就抓取了给定地址中的图片信息了,我们选取其中一张:

http://image.ngchina.com.cn/2018/0428/20180428110510703.jpg

网络图片

入库并进行下一轮抓取

在我们抓取到指定内容后,我们可以将其存在数据库保存;如果是link型的抓取,我们可以建立url队列,将指定的url中的新的link加入到url队列来,然后一轮一轮的遍历抓取,对于队列url的处理,需要根据具体需求采用相应的策略,以完成相应的任务工作。更多爬虫信息可以参考:初始爬虫


补充:

在我们编写正则表达式时,可以使用在线正则表达式工具,快速看到匹配结果:菜鸟正则工具,这个地址中还有一些常用的,已经写好的正则表达式,如电话、QQ号、网址、邮箱等等,非常好用。

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值