Python爬虫系列之百度贴吧爬取

版权声明:Author:WangLei https://blog.csdn.net/qq_41287993/article/details/84582372

今天给的一个爬虫小事例,贴吧段子爬取这样一个小功能,数据呢仅仅娱乐,没有恶意想法

若有侵权,请私信删除

  • 此次用到的一个解析库Beautiful Soup,更轻量简单地对数据进行解析,已获得目标数据
  • 贴吧做的还是比较好,有一定的反爬机制,所以我们也应该有一定的应对措施,具体对应我们requests获取到的数据对应页面源代码,通过观察发现数据的是否异步与注释等等反爬问题
  • 以下是代码部分
# -*- coding:utf-8 -*-
from bs4 import BeautifulSoup
import requests
import re
import time
import urllib.parse

'''
    Author:王磊
    Time  :2018/11/27 20:22:36
'''

header = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.221 Safari/537.36 SE 2.X MetaSr 1.0"}


def getHTML(url):
    '''
    通过url获取html
    :param url:
    :return:htmlStrs
    '''
    res = requests.get(url, headers=header)
    html = res.content.decode('utf-8', 'ignore')
    html = html.replace("<!--", "")
    html = html.replace("-->", "")
    return html


def parseSaveData(html):
    '''
    通过html代码解析数据并保存
    :param html:
    :return:None
    '''
    soup = BeautifulSoup(html, 'html.parser')
    # req = re.compile(r'<span.*?class="tb_icon_author.*?".*?>.*?</span>', re.S)
    # print(re.findall(req, html))
    # 每条帖子数据
    uls = soup.findAll('li', attrs={"class": re.compile(r'j_thread_list.*?')})
    lens = len(uls)
    with open('C:\\Users\\asus\\Desktop\\pc\\text\\tieba.txt', 'a', encoding='gbk') as f:
        for i in range(lens):
            Utitle = uls[i].findAll('a', attrs={"rel": re.compile(r'noreferrer.*?')})[0]['title']
            Uauthor = uls[i].findAll('span', attrs={"class": re.compile(r'tb_icon_author.*?')})[0]['title']
            print(Utitle)
            print(Uauthor)
            print("*" * 50)
            Utitle = (Utitle + '\r\n').encode("GBK", 'ignore').decode('gbk')
            Uauthor = (Uauthor + '\r\n').encode("GBK", 'ignore').decode('gbk')
            f.write(Utitle)
            f.write(Uauthor)
            f.write("*" * 50 + '\r\n')


def getPages(html):
    '''
    通过html获取当前贴吧总帖子页数
    :param html:
    :return: pageNums
    '''
    soup = BeautifulSoup(html, 'html.parser')
    endPages = soup.findAll('a', attrs={"class": re.compile(r'last.*?pagination-item.*?')})
    return int(urllib.parse.urlparse('http://' + endPages[0]['href'])[4].split("=")[3])


def main():
    '''
    入口函数
    :return:None
    '''
    name = urllib.parse.quote('电子科技大学成都学院')
    url = 'http://tieba.baidu.com/f?kw=' + name + '&ie=utf-8&pn=0'
    # 获取数据
    html = getHTML(url)
    # 获取页面数
    pages = getPages(html)
    # 循环获取页数据并存储
    index = 0
    for i in range(pages):
        url = 'http://tieba.baidu.com/f?kw=' + name + '&ie=utf-8&pn=' + str(index)
        #分析保存数据
        parseSaveData(html)
        index += 50
        time.sleep(3)


if __name__ == '__main__':
    main()

☞点击这里与我探讨☚

♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪
♪♪后续会更新系列基于Python的爬虫小例子,欢迎关注。♪♪
♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪

猜你喜欢

转载自blog.csdn.net/qq_41287993/article/details/84582372