因为学习需要,自己做了一个可以爬取那啥网站新闻内容的爬虫.没什么花里胡哨的东西,就是找到网页中新闻界面的url,然后进入把内容提取出来,然后存到excel表格里.里面的代码都是分成不同函数的,注释也很详细,记录一下,防止自己以后忘记.
import requests import urllib import urllib.request import re import openpyxl as op from openpyxl import load_workbook from bs4 import BeautifulSoup #这个文件可以直接爬取摘要,但是会有重复和数量限制。 #对链接list使用set方法,可以去除自己列表中的重复元素 def get_url(url):# 输入网址url,爬取整页的全部链接,使用list_url返回 data = urllib.request.urlopen(url).read() data = data.decode('UTF-8')#########################################这个注释之后解决了一个问题 #print(data) linkre = re.compile('href="(.+?)"')#正则表达式# list_url = [] for x in linkre.findall(data): #if '.eastmoney.com' in x : if 'http://finance.eastmoney.com' in x or 'https://stock.eastmoney.com' in x: list_url.append(x) return list_url def verify_abstract(url):#验证是否有摘要,有则返回1,无则返回0 res = requests.get(url) soup = BeautifulSoup(res.text, 'lxml') data = soup.select('body > div.main > div.contentwrap > div.contentbox > div.mainleft > div.zwinfos > div.abstract > div.tit') # 定位数据,新闻 #print("data数据类型:") #print(type(data)) string = '验证' for item_data in data: string = item_data.get_text('tit') if string=='摘要': return 1 #print("有摘要") else: #print("无摘要,退出!") return 0 return 1 def time_abstract(url):#使用url对应的地址,获取其中的时间和摘要 # url = 'https://finance.eastmoney.com/a/202207122446929516.html' res = requests.get(url) soup = BeautifulSoup(res.text, 'lxml') data = soup.select('body > div.main > div.contentwrap > div.contentbox > div.mainleft > div.zwinfos > div.abstract > div.txt') # 定位数据,新闻 date = soup.select('#topbox > div.tipbox > div.infos > div:nth-child(1)') # 定位日期 #print(date) # html文件 result_ta = dict() for item_date in date: result = { 'date': item_date.get_text('item') } date = result['date'] date.replace('n', '').replace('r', '') result_ta['日期'] = date for item_data in data: result = { 'abstract': item_data.get_text('txt') } abstract = str(result['abstract']) # 摘要前后有空格,注意删除 abstract = str(abstract).replace(' ', '').replace('n', '').replace('r', '') result_ta['摘要'] = abstract return result_ta def verify_repetition(list1,list2):#若是list2里面有list1的元素,则删除list2里的重复元素 result = [] for i in list2:#遍历list2,不相同的留下 if i not in list1: result.append(i) else: continue return result def create_excel():#创建一个excel表格 ws = op.Workbook() wb = ws.create_sheet(index=0) wb.cell(row=1, column=1, value='序号') wb.cell(row=1, column=2, value='时间') wb.cell(row=1, column=3, value='摘要') ws.save('D:\金融数据集东方财富摘要.xlsx') return 0 def write_data(result,seq):#直接调用该函数将内容写入其中,seq计数 wb = load_workbook('D:\金融数据集东方财富摘要.xlsx') # 激活excel表 sheet = wb.active #seq+=1 # 向excel中写入对应的value sheet.cell(row=seq, column=1).value = seq sheet.cell(row=seq, column=2).value = result['日期'] sheet.cell(row=seq, column=3).value = result['摘要'] print("数据"+str(seq)+"写入成功") wb.save('D:\金融数据集东方财富摘要.xlsx')#该方法会覆盖原有内容 return 0 url = 'https://www.eastmoney.com' create_excel()#先创建一个excel表格 seq = 1#计数用,写入内容需要计数 list_first_url = get_url(url)#第一页所有链接 list_old = ['https://www.eastmoney.com'] list_2 = ['https://www.eastmoney.com'] print(list_first_url) print("第一层链接加载完毕,进入数据验证模块...") while len(list_first_url) != 0:#删除的这一块,还是很奇怪 list_old = list_old + list_first_url # 已访问链接更新 list_old = list(set(list_old)) for i in range(len(list_first_url) - 1, -1, -1): if verify_abstract(list_first_url[i]) == 0: # 链接更新模块 list_1 = get_url(list_first_url[i])#过渡列表 list_2 = list_2+list_1#第二层的链接数据 #list_first_url = list_first_url + list_1 # 第一层url continue else: #链接更新模块 list_1 = get_url(list_first_url[i]) list_2 = list_2+list_1 # 第二层的链接数据 write_data(time_abstract(list_first_url[i]),seq)#字典数据和seq作为参数,才能进行数据写入运算 seq+=1 list_first_url.remove(list_first_url[i]) list_first_url = verify_repetition(list_old,list_2)#更新为二层链接,删除了已用的链接 list_first_url = list(set(list_first_url)) print("进入下一层链接") print("爬虫结束!")
要说爬虫主要难在哪里,大概就是是不知道自己要做什么.一般就分以下几步:
1.利用进入网页,获取网页内容
2.利用定位方法定位到自己需要的数据所在位置
3把数据打包,然后存储到自己想要的位置.