实验目的:获取“http://blog.csdn.net/”网页上的所有链接
思路
1)确定好要爬取的入口链接
2)根据需求构建好链接要提取的正则表达式
3)模拟成浏览器并爬取对应网页
4)根据步骤2中的正则表达式提取出该网页中包含的链接
5)过滤掉重复的链接
6)后续操作,比如屏幕上输出这些链接
源代码:
# -*- coding: utf-8 -*-
# __author__ = 'Carina'
import re # 导入正则表达式
import urllib.request
def getlink(csdnurl):
# 模拟成浏览器
headers = ("User-Agent", "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:55.0) Gecko/20100101 Firefox/55.0")
opener = urllib.request.build_opener() # 修改表头信息
opener.addheaders = [headers]
# 将opener安装为全局
urllib.request.install_opener(opener)
file = urllib.request.urlopen(csdnurl)
data = str(file.read())
# print(data)
# 根据需求构建好链接表达式
pat = '(https?:// [^\s)";]+\.(\w|/)*)'
link = re.compile(pat).findall(data)
print(link)
# 去除重复数据
link = list(set(link))
return link
# 要爬取的网页链接
csdnurl = "http://blog.csdn.net/"
# 获取对应网页中包含的链接地址
linklist = getlink(csdnurl)
# 通过for 循环分别遍历输出获取到的链接地址到屏幕上
for link in linklist:
print(link[0])
正则表达式的构造不一定是固定的,需要根据需求来调整,只有更好,没有最好
针对代码中的表达式 (https?:// [^\s)";]+.(\w|/)*) 做下简单的解释
确定链接的简单版格式:http(s)://xxx.yyy
1、协议部分有些是 http,有些是 https,s? 表示s可有可无
2、xxx 部分 不可以出现空格,双引号,分号
3、yyy 部分可以是一些非特殊字符,也可以是”/“符号