一、利用python中的requests和第三方BeautifulSoup即可完成爬取,且代码简便易懂

  示例:爬取网站中的所有古风网名:http://www.oicq88.com/gufeng/,并储存入数据库(mysql)

     python版本:3.6.5(没有python环境的,可参考安装:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014316090478912dab2a3a9e8f4ed49d28854b292f85bb000

        

       编辑器:pycharm(当然如果想要简单操作试试看的,也可以用电脑终端)

       存储入excel或mysql

       数据库:mysql

       框架:flask

  (1) 爬取数据并存入excel中

# -*- coding:UTF-8 -*-
import xlwt
from bs4 import BeautifulSoup
import requests


# 获取某个页面的html文本
def get_html(url):
    headers = {
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.162 Safari/537.36'
    }
    res = requests.get(url, headers=headers)
    res.encoding = "UTF-8"
    return res.text


# 采用递归筛选出所有页面中符合要求的名字
def getAllNames(names, url, page):
    html = get_html(url + page)
    bs = BeautifulSoup(html, 'html.parser')
    nameTags = bs.select("div[class=listfix] li p")
    names.extend(nameTag.string for nameTag in nameTags)  # 下方的简写
    aTags = bs.select("div[class=page] a[class=next]")
    for aTag in aTags:
        if aTag.string == "下一页":
            newUrl = aTag["href"]
            # print(newUrl)
            # urls.append("http://www.oicq88.com/" + newUrl)
            getAllNames(names, url, newUrl)  # 只要有下一页,则继续查询下一页
    return names

#将抓取到的信息存入excel中
def save_excel(title, headerTag, content, fileName):
    book = xlwt.Workbook(encoding='utf-8')    #创建 workbook 即新建 excel 文件/工作簿
    sheet = book.add_sheet(title, cell_overwrite_ok=True)    #创建工作表,如果想创建多个工作表,直接在后面再 add_sheet
    rows = len(content) + 2                    #工作表的行数
    for i in range(rows):
        if i == 0:                             #工作表标题
            sheet.write_merge(i, 0, 0, len(headerTag) - 1, title, set_style(0x06,True))  # write_merge(x, m, y, n, string, sytle) x表示行,y表示列,m表示跨行个数,n表示跨列个数,string表示要写入的单元格内容,style表示单元格样式。
        elif i == 1:                          #工作表列名
            for tag_name_i in headerTag:
                sheet.write(i, headerTag.index(tag_name_i), tag_name_i, set_style(0x00,True))     #写入数据,共 3 个参数,第一个参数表示行,从 0 开始;第二个参数表示列从 0 开始;第三个参数表示插入的数值;第四个是单元格样式(可忽略)
        else:                    #存储收集到的网名
            sheet.write(i, 0, i-1, set_style(0x00,False))
            sheet.write(i, 1, content[i-2], set_style(0x00,False))
    try:
        book.save(r'C:/Users/msi/Desktop/%s.xls' % fileName)  #保存路径自行更改
    except Exception as e:
        print('ERROR' + str(e))

#设置单元格样式
def set_style(color,bold):
    style=xlwt.XFStyle()
    font=xlwt.Font()
    font.colour_index=color
    font.bold = bold
    style.font=font
    al = xlwt.Alignment()
    al.horz = 0x02  # 设置水平居中
    al.vert = 0x01  # 设置垂直居中
    style.alignment = al
    return style

if __name__ == '__main__':
    target = 'http://www.oicq88.com'
    page = "/gufeng/1.htm"
    names = []
    getAllNames(names, target, page)
    title = "古风网名大全"
    headerTag = ["", "网名"]
    print(len(names))
    print(names[-1])
    print(names[0])
    save_excel(title, headerTag, names, "name") #将数据保存进excel

    运行结果如下图:

      

  可能出现的错误:PermissionError: [Errno 13] Permission denied

    原因:1. 此文件你可能已经打开,关闭即可

       2. 路径是一个文件夹,应该是文件名

         

   (2) 爬取数据并存入mysql中没有用到orm映射,只是简单地交互)

# -*- coding:UTF-8 -*-
import xlwt
from bs4 import BeautifulSoup
import requests
from pymysql import connect

# 获取某个页面的html文本
def get_html(url):
    headers = {
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.162 Safari/537.36'
    }
    res = requests.get(url, headers=headers)
    res.encoding = "UTF-8"
    return res.text

# 采用递归筛选出所有页面中符合要求的名字
def get_allUrl(names, url, page):
    # urls = []
    html = get_html(url + page)
    bs = BeautifulSoup(html, 'html.parser')
    nameTags = bs.select("div[class=listfix] li p")
    names.extend(nameTag.string for nameTag in nameTags)  # 下方的简写
    # for nameTag in nameTags:
    #     # print(nameTag.string)
    #     names.append(nameTag.string)
    aTags = bs.select("div[class=page] a[class=next]")
    for aTag in aTags:
        if aTag.string == "下一页":
            newUrl = aTag["href"]
            # print(newUrl)
            # urls.append("http://www.oicq88.com/" + newUrl)
            get_allUrl(names, url, newUrl)  # 只要有下一页,则继续查询下一页
    return names

#储存数据进数据库
def insertNames(names):
    #  建立链接
    conn = connect(
        host='localhost',
        port=3306,
        db='test',
        user='root',
        password='root',
        charset='utf8'
    )
    # 获取游标
    cursor = conn.cursor()
    # 批量插入数据
    sql = "insert into user(name) values (%s)"
    for name in names:
        rowCount = cursor.execute(sql, name)
        print("SQL语句影响的行数为%d" % rowCount)
    # 统一提交
    conn.commit()
    # 关闭游标 
    cursor.close()
    # 关闭连接
    conn.close()

if __name__ == '__main__':
    target = 'http://www.oicq88.com'
    page = "/gufeng/1.htm"
    names = []
    get_allUrl(names, target, page)
    title = "古风网名大全"
    headerTag = ["", "网名"]
    print(len(names))
    print(names[-1])
    print(names[0])
    # save_excel(title, headerTag, names, "name") #将数据保存进excel

    # 储存进数据库
    insertNames(names)

  运行结果如下图:

    

  使用的是事务提交,某一条插入出错时,则会回滚,即所有的数据均不会插入

 

 

参考教程如下: 爬取:https://blog.csdn.net/u012662731/article/details/78537432

        html解析时BeautifulSoup的使用:https://www.jb51.net/article/65287.htm

        将数据存储到excel中:https://dedewp.com/17500.html

        excel设置样式:http://www.cnblogs.com/hanjiajiejie/p/9370253.html  

        数据库交互:https://blog.csdn.net/yyh2685/article/details/81481366

 附:java爬取数据

posted on 2018-12-07 14:45  木风向前冲  阅读(327)  评论(0)    收藏  举报