抓取糗事百科段子保存到MySQL中

目录

  1. 1. ..
  2. 2. 硬核
    1. 2.1. 需要的模块
    2. 2.2. 模拟浏览器
    3. 2.3. 数据入库
    4. 2.4. 抓取分析网页:
    5. 2.5. 调取
  3. 3. 后续

..

每天进步一点点
历经劫难,终于搞定了。自动抓取网页信息并保存到数据库中。

硬核

需要的模块

import urllib.request
import re
import urllib.error
import MySQLdb

模拟浏览器

有些网站有反爬机制,必须要模拟成电脑浏览器才行,必要时候还需要代理。

headers = ('User-Agent','Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.129 Safari/537.36')
opener = urllib.request.build_opener()
opener.addheaders = [headers]
urllib.request.install_opener(opener)

数据入库

这里入坑比较多,主要是数据类型的处理,sql变量部分,他是字符串,是给模块处理的,cur.execute(sql, (a, b, c))部分。python源码:def execute(self, query, args=None): query为传入指令,而args传入的为list或tuple数据类型。

def push_db(a, b, c): #a b c 指代author、content和id
    db = MySQLdb.connect(
        host = '127.0.0.1',
        port = 3306,
        user = '****',     #数据库用户名
        password = '******', #数据库密码
        db = 'qiushibaike',
        charset = 'utf8'
    )
    cur = db.cursor()
    sql =  "insert into main (author, content, id) values (%s, %s, %s)"
    try:
        cur.execute(sql, (a, b, c)) 
        cur.close()
        db.commit()
    except:
        db.rollback()
    db.close()

抓取分析网页:

def crawl(url, page_num):
    for i in range(0, page_num):
        real_url = url + str(i+1)
        try:
            data = urllib.request.urlopen(real_url).read().decode('utf-8', 'ignore')
            pat_1 = "<h2>(.*?)</h2>"  #author
            pat_2 = '<div class="content">.*?<span>(.*?)</span>.*?</div>'   #content

            author = re.compile(pat_1, re.S).findall(data)
            content = re.compile(pat_2, re.S).findall(data)

            for j in range(0, len(author)):
                author[j] = author[j].replace('\n', '')
                content[j] = content[j].replace('<br/>', '\n')
                print("-------"+str(j+1)+"------>") 
                push_db(author[j], content[j],str(i+1)+"-"+str(j+1))

        except urllib.error.URLError as error:
            if(hasattr(error, 'code')):
                print(error.code)
            if(hasattr(error, 'reason')):
                print(error, reason)

调取

url = "https://www.qiushibaike.com/text/page/"
page_num = input("请输入你要抓取的页面条数:")
crawl(url, int(page_num))

后续

可以安装MySQL可视化软件例如:navicat,将库中的数据以Excel导出,然后分析数据。