上一篇文章简单介绍了一下正则的基本语法,今天这篇文章就讲一个用正则来爬取糗事百科的例子
一、引入模块
因为urlopen功能比较简单,所以设置代理ip需引入ProxyHandler和build_opener模块,ip的获取可以上西祠代理查询
import re
from urllib.request import Request,build_opener,ProxyHandler
base_url = 'https://www.qiushibaike.com/hot/page/'
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'
}
ip_list = [
'220.249.185.178:9999',
'124.193.85.88:8080',
'116.62.194.248:3128',
'112.115.57.20:3128',
'171.37.143.73:9797'
]
proxies = {
'http:':random.choice(ip_list)
}
二、设置代理IP,获取网页内容
def down_load_qiubai_info(pageIndex):
full_url = base_url + str(pageIndex) + '/'
# print(full_url)
#添加headers设置爬虫目标以及用户标识
#如果只写full_url等于告诉网页获取网页内容的不是自然人,而是程序
# 因为程序自带 User_Agent:Python urllib / 3.6
request = Request(full_url,headers=headers)
#设置代理IP
proxies_Handler = ProxyHandler(proxies)
opener=build_opener(proxies_Handler)
response = opener.open(request)
# 获取对应网页的全部内容
code = response.read().decode()
三、根据获取的源码获取糗事百科内容
鼠标右键检查, 每个浏览器都不一样我这里用的是谷歌浏览器
注意:(.*?)表示要获取的内容, 正则匹配的内容 从指定的开始位置 到全部内容结束 , 所以只需要指定开始的位置 不需要指定结束的位置 , 如果我们想要正则获取某一对标签里面的内容的时候 , 那么需要将这对标签对写完整 而且咋想要获取的内容 , 上添加()例如:<h2>(.*?)</h2>
#使用正则获取姓名,年龄,内容,评论,评论数 等
#根据获取的内容在网页中的位置写正则
pattern = re.compile(r'<div class="author clearfix">.*?<h2>(.*?)</h2>.*?<div class="articleGender.*?Icon">(.*?)</div>.*?<a.*?href="(.*?)".*?>.*?<div class="content">.*?<span>(.*?)</span>.*?<div class="stats">.*?<i class="number">(.*?)</i>.*?<span class="stats-comments">.*?<i class="number">(.*?)</i>',re.S)
#在源码中查找所有符合正则的内容
result = pattern.findall(code)
# print(result)
for name,age,href,content,stats,comment in result:
# strip去除 换行
name = name.strip('\n')
age =age.strip('\n')
content = content.strip('\n')
href = href.strip('\n')
stats = stats.strip('\n')
comment = comment.strip('\n')
# print(name)
# print(age)
# print(content)
print(href)
# print(stats)
# print(comment)
if int(comment)!=0:
get_all_comment_with(href)
else:
print('该内容暂无评论')
四、获取评论人的个人主页
def get_all_comment_with(url):
#拼接url
detail_url = 'https://www.qiushibaike.com'+ url
# print(detail_url)
#获取源码
request = Request(detail_url,headers=headers)
response = urlopen(request)
code = response.read().decode()
#根据位置写正则
pattern = re.compile(r'<div class="avatars">.<a href="(.*?)".*?>',re.S)
#在源码中查找所有符合正则的内容
result = pattern.findall(code)
# print(result)
for x in result:
x = x.strip('\n')
# print(x)
#拼接url
url_list = 'https://www.qiushibaike.com'+ x
print(url_list)
以上就是用正则爬取糗事百科的步骤。在写正则的时候一定要注意要根据网页源码来写,想要获取的内容用()括起来,
其他的不需要使用的内容用.*?或者其他元字符代替。