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