zoukankan      html  css  js  c++  java
  • python爬虫

    一、利用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爬取数据

  • 相关阅读:
    用Web标准进行开发
    哪个是你爱情的颜色?
    由你的指纹,看你的性格。
    让你受用一辈子的181句话
    漂亮MM和普通MM的区别
    ASP构造大数据量的分页SQL语句
    随机码的生成
    爱从26个字母开始 (可爱的史努比)
    浅谈自动采集程序及入库
    值得收藏的JavaScript代码
  • 原文地址:https://www.cnblogs.com/mufengforward/p/9552261.html
Copyright © 2011-2022 走看看