爬虫方法封装及存储(以糗百为例)

# 1.爬取作者信息(头像/昵称/性别/年龄)
# 2.帖子内容,好笑数,评论数
# 3.存入 csv

# 翻页处理方式
# 1.分开处理   一页一页处理 (例:爬取当前页后直接存储)
# 2.翻页到结束处理  从首页翻页到尾页 (例:翻页到尾页后统一处理)
import csv
import pymysql
import requests
from bs4 import BeautifulSoup

#爬取一页的内容
def qb_spider1(page=1):
    url_temp = "https://www.qiushibaike.com/text/page/{}/".format(page)
    #print(url_temp)
    rep=requests.get(url=url_temp)
    soup=BeautifulSoup(rep.text,"lxml")
    articles = soup.find_all("div", class_='article')
    article_infos = []
    datas=[]
    for article in articles:
        author_div=article.find("div",class_="author")
        author_img=article.img
        author_icon=author_img.attrs['src']
        author_icon="https:"+author_icon
        author_name = author_img.attrs['alt']

        if "匿名用户" not in author_name:
            article_gender = author_div.div
            author_age = article_gender.text.strip()
            article_gender_class = article_gender.attrs['class']
            author_gender="man" if "man" in article_gender_class else "woman"
        else:
            author_age = -1
            author_gender = "no"

        article_content = article.find("div", class_='content')
        article_stats = article.find_all("i", class_='number')
        #print(article_stats)

        article_content = article_content.span.text.strip()
        stats_vote = article_stats[0].text.strip()
        stats_comment = article_stats[1].text.strip()

        #双列表存储
        article_info = [author_icon, author_name, author_gender, author_age, article_content, stats_vote, stats_comment]
        article_infos.append(article_info)

        #存入字典在存入列表
        item={}
        item['头像']=author_icon
        item['用户名'] =author_name
        item['性别'] =author_gender
        item['年龄'] =author_age
        item['段子'] =article_content
        item['好笑数'] =stats_vote
        item['评论'] =stats_comment
        datas.append(item)




    next_tag=soup.find('span',class_='next')
    has_next=False
    if next_tag is None:
        has_next=False
    else:
        has_next=True

    return datas,has_next


# 2.翻页到结束处理  从首页翻页到尾页 (例:翻页到尾页后统一处理)
def qb_spider2(page=1):
    url_temp = "https://www.qiushibaike.com/text/page/{}/".format(page)
    # print(url_temp)
    rep = requests.get(url=url_temp)
    soup = BeautifulSoup(rep.text, "lxml")
    articles = soup.find_all("div", class_='article')
    article_infos = []
    for article in articles:
        author_div = article.find("div", class_="author")
        author_img = article.img
        author_icon = author_img.attrs['src']
        author_icon = "https:" + author_icon
        author_name = author_img.attrs['alt']

        if "匿名用户" not in author_name:
            article_gender = author_div.div
            author_age = article_gender.text.strip()
            article_gender_class = article_gender.attrs['class']
            author_gender = "man" if "man" in article_gender_class else "woman"
        else:
            author_age = -1
            author_gender = "no"

        article_content = article.find("div", class_='content')
        article_stats = article.find_all("i", class_='number')
        # print(article_stats)

        article_content = article_content.span.text.strip()
        stats_vote = article_stats[0].text.strip()
        stats_comment = article_stats[1].text.strip()

        # 双列表存储
        article_info = [author_icon, author_name, author_gender, author_age, article_content, stats_vote, stats_comment]
        article_infos.append(article_info)

    next_tag = soup.find('span', class_='next')
    has_next = next_tag is not None
    if has_next:
        article_infos.extend(qb_spider2(page + 1))  #调用自己本身

    return article_infos

#双列表写入csv
def list_write_to_csv(data_, filename):
    with open(filename + '.csv', "w", newline='', encoding='utf-8-sig') as f:
        writer = csv.writer(f)
        writer.writerows(data_)

#列表存字典写入csv
def dict_write_to_csv(data_,filename):
    with open(filename + '.csv','w',encoding='utf-8',newline='')as f:
        writer=csv.writer(f)
        writer.writerow(data_[0].keys())
        for data in data_:
            writer.writerow(data.values())

#存入数据库(提前建好表)
def write_to_mysql(item):
    author_icon=item['头像']
    author_name=item['用户名']
    author_gender=item['性别']
    author_age=item['年龄']
    article_content=item['段子']
    stats_vote= item['好笑数']
    stats_comment=item['评论']

    conn=pymysql.connect(host='192.168.169.157',user='root',passwd='123456',db='haha',port=3306,charset='utf8')
    with conn:
        cur=conn.cursor()
        insert_sql="insert into qiubai (author_icon,author_name,author_gender,author_age,article_content,stats_vote,stats_comment) values(%s,%s,%s,%s,%s,%s,%s)"
        cur.execute(insert_sql,(author_icon,author_name,author_gender,author_age,article_content,stats_vote,stats_comment))
        conn.commit()
       



def main1():
    articles=qb_spider1()
    page=1
    has_next=True
    all_articles = []
    while has_next:
        articles, has_next = qb_spider1(page)
        page += 1
        all_articles.extend(articles)
        # 用extend 不能用append
        # 使用extend的时候,是将articles看作一个序列,将这个序列和all_articles序列合并,并放在其后面。【   】
        # 使用append的时候,是将articles看作一个对象,整体打包添加到all_articles对象中。  【   【 】 】
        print(has_next, page)
    for item in all_articles:
        print(item)
    #dict_write_to_csv(all_articles,'qbpachong')
        write_to_mysql(item)


def main2():
    all_articles = qb_spider2()
    list_write_to_csv(all_articles, "qiushibaike_text")
    for item in all_articles:
        print(item)


if __name__=="__main__":
    main1()

自己常用的两种储存方式

字典写入csv.png
双列表形式写入csv.png
数据存储至MySQL.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容

  • 你既没手也无脚 时不时还遭人鄙弃 可为了你庭院的美好 你,你从不考虑我们人的烦恼 总是风驰电掣地旋转 我来不及站稳...
    平心如我阅读 208评论 0 0
  • "别人的眼光真的那么重要吗?"这个问题我在心里问过自己无数次,每次都有新的思考。在乎别人的眼光的人没有错,但是...
    一晔阅读 870评论 0 1
  • 早上我6点过就醒了,跟朋友约起去帮我找青苔。到儿子卧室看,儿子已经醒了,我就去煮饺子,煮好了,我叫儿子起来...
    紫玉_b836阅读 257评论 2 2