python3.7爬取百度贴吧 并保存至MySQL数据库和文本文件

 数据库连接所用到的pymysql驱动包请自行下载。

此爬虫爬取了贴吧帖子内容等。

​
# -*- coding: utf-8 -*-
import requests
import time
from bs4 import BeautifulSoup
import pymysql
import os
import sys
#sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='gbk') #改变标准输出的默认编码

#抓取网页的通用框架,获取页面的内容
def getHtml(url):
    try:
        r= requests.get(url,timeout=30)
        #状态码不是200就发出httpError的异常
        r.raise_for_status()
        #获取正确的编码格式
        # r.encoding=r.apparent_encoding
        r.encoding="utf-8"
        #打印内容
        return r.text
 
 
    except:
        return "wrong!"
 
 
 
#分析网页的html文件,整理信息,保存问列表文件中
def get_content(url):
    #初始化一个列表来保存所有的帖子信息
    contents=[]
 
    #获取网页的内容
    html=getHtml(url)
 
    #将网页内容格式化利用bs4库
    soup = BeautifulSoup(html, 'lxml')
 
    #获取所有的li标签属性为 j_thread_list clearfix,用列表接收,获取子列表
    liTags = soup.find_all('li', attrs={'class': ' j_thread_list clearfix'})
    print(len(liTags))
 
    #循环这个内容li集合
    for li in liTags:
 
        #将爬取到了每一条信息。保存到字典里
        content={}

        #将异样抛出,避免无数据时,停止运
        try:
             #开始筛选信息
             content['title']=li.find('a',attrs={"class":"j_th_tit"}).text.strip()#.strip()  翻译为中文
             ##print (li.find('a',attrs={"class":"j_th_tit"}).text.strip())
             #获取a标签的内部属性
             content['link'] ="http://tieba.baidu.com/"+li.find('a', attrs={"class": "j_th_tit"})["href"]
             #print("http://tieba.baidu.com/"+li.find('a', attrs={"class": "j_th_tit"})["href"])
 
 
             content['author']=li.find('span',attrs={"class":'tb_icon_author '}).text.strip()
             #print (li.find('span',attrs={"class":'tb_icon_author '}).text.strip())
 
 
             content['responseNum']=li.find('span',attrs={'class': 'threadlist_rep_num center_text'}).text.strip()
             #print(li.find(
             #    'span', attrs={'class': 'threadlist_rep_num center_text'}).text.strip())
             content['creatTime']=li.find('span',attrs={"class":'pull-right is_show_create_time'}).text.strip()
             #print (li.find(
             #   'span', attrs={'class': 'pull-right is_show_create_time'}).text.strip())
            
             content['text']=li.find('div',attrs={"class":'threadlist_abs threadlist_abs_onlyline '}).text.strip()
             #print(li.find('div',attrs={"class":'threadlist_abs threadlist_abs_onlyline '}).text.strip())
             #将字典加入到列表中
             contents.append(content)
 
 
        except:
            print('获取内容出问题')

 
 
 
        #返回数据
    return contents

#写入数据库
def writedata(content):
    try:
        conn=pymysql.connect(host="localhost",
                             port=3306,
                             user="root",
                             passwd="123456",
                             db="test",
                             charset='utf8')
        for c in content:
            sql="insert into crawler1 values(NULL,'"+c['title']+"','"+c['link']+"','"+c['author']+"','"+c['creatTime']+"','"+c['responseNum']+"','"+c['text']+"')"
            cursor =conn.cursor()
            cursor.execute(sql)
            conn.commit()
    except Exception as e:
        print("出问题")
        conn.rollback()
        raise e
    finally:
        conn.close()

    
def writeTxt(content):
 
    #这里不能写成 f=open("data.txt",'a+')否则会乱码,设置成utf-8的格式,与getHtml(url):中的encoding一致
    f=open("data.txt",'a+',encoding='utf-8')
 
    for c in content:
        f.write('标题: {} \t 链接:{} \t 发帖人:{} \t 发帖时间:{} \t 回复数量: {} \n'.format(
                c['title'], c['link'], c['author'], c['creatTime'], c['responseNum']))
        #print(c['title'])
 
 
url="http://tieba.baidu.com/f?kw=%D6%D0%B9%FA%CA%AF%D3%CD%B4%F3%D1%A7&fr=ala0&tpl=5"
page=1
 
 
def main(url,page):
    url_list=[]
    #将所需要爬取的url放到列表中
    for i in range(0,page):
        url_list.append(url+'&pn='+str(i*50))
 
    for u in url_list:
        content=get_content(u)
        writeTxt(content)
        writedata(content)

 
if __name__=="__main__":
    main(url,page)
    #get_content("http://tieba.baidu.com/f?kw=%D6%D0%B9%FA%CA%AF%D3%CD%B4%F3%D1%A7&fr=ala0&tpl=5")
 
 
 

​

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值