Python爬取糗事百科

上一篇文章简单介绍了一下正则的基本语法,今天这篇文章就讲一个用正则来爬取糗事百科的例子

一、引入模块

因为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)

以上就是用正则爬取糗事百科的步骤。在写正则的时候一定要注意要根据网页源码来写,想要获取的内容用()括起来,

其他的不需要使用的内容用.*?或者其他元字符代替。

猜你喜欢

转载自blog.csdn.net/qq_42603652/article/details/81279417