因为学习需要,自己做了一个可以爬取那啥网站新闻内容的爬虫.没什么花里胡哨的东西,就是找到网页中新闻界面的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把数据打包,然后存储到自己想要的位置.