前面我们使用了 requests 这个类库对网页全部数据的请求,但是随着需求的提高,全部获取数据已经不满足我们的要求了,我们需要对网页中某些数据进行提取而已,其他没有用的数据没必要获取下来,这时候我们就需要对页面数据进行筛选了,筛选的办法有很多,正则表达式是我们使用最多的方式之一,因此接下来我们就使用 requests 和 正则表达式去获取 csdn 页面中全部的链接 和 糗事百科列表里的 用户名 和 对应的发表内容
(正则表达式学习地址:http://www.runoob.com/python/python-reg-expressions.html)
案例一:获取 csdn 页面中全部的链接 (http://blog.csdn.net/)
#定义爬取 csdn 页面中的所有网页链接
def get_csdn_url(url):
r = requests.get(url, headers=headers)
r.encoding = "utf-8" #编码
data = r.text #转换成文本(返回的结果是 html 源码)
reg = r'(https?://[^\s)";]+\.(\w|/)*)'#根据需求构建好链接表达式
link_list = re.compile(reg, re.S).findall(data)
link_list = list(set(link_list)) #去掉重复元素
return link_list
#调用
url = "http://blog.csdn.net/"
linklist = get_csdn_url(url)
for link in linklist: # i 是元组
print(link[0])
效果图如下:
案例二:爬取糗事百科列表里的 用户名 和 对应的发表内容(https://www.qiushibaike.com/8hr/page/第几页/)
#定义爬取 糗事百科 用户名和内容 的函数
def get_qiushi_username_content(url, page):
r = requests.get(url, headers=headers)#请求内容
r.encoding = "utf-8"#设置编码
data = r.text #获取文本内容
#用户名
reg_un = r'<h2>(.*?)</h2>'
user_list = re.compile(reg_un, re.S).findall(data)
#内容
reg_content = r'<div class="content">.*?<span>(.*?)</span>.*?</div>'
content_list = re.compile(reg_content, re.S).findall(data)
x = 1
#通过 for 循环遍历段子内容并将内容分别赋给对应的变量
for content in content_list:
content = content.replace("\n","")
#用字符串作为变量名,先将对应的字符串赋给一个变量
name = "content"+str(x)
#通过 exec() 函数实现用字符串作为变量名并赋值
exec(name +'=content')
x += 1 #自增
y = 1
#通过 for 循环遍历用户,并输出该用户对应的内容
for user in user_list:
name = "content"+str(y)
print("第 "+ str(page) +" 页,第 "+ str(y) +" 个用户名:"+ user)
print("对应内容为: ")
exec("print("+ name +")")
print("\n")
y += 1
#调用
for i in range(6): #顺手爬取5页数据
url = "https://www.qiushibaike.com/8hr/page/"+str(i)
get_qiushi_username_content(url, i)