提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
提示:这里可以添加本文要记录的大概内容:
随着互联网的快速发展,世界上涌现出了大量的数据,所以这时候爬虫技术也相应出现。我这篇文章写的是对selenium库的应用,怎么定位标签,获取元素。下面是以本校的官网为例子,爬取通告。
一、爬取步骤
1.初始化
代码如下(示例):
option = ChromeOptions()
option.add_experimental_option(‘excludeSwitches’, [‘enable-automation’])
option.add_argument(“–no-sandbox”)
option.add_argument(“–lang=zh-CN”)
driver = webdriver.Chrome(options=option, executable_path=r’E:\1.爬虫需求\009.爬取数据保存到xlsx\chromedriver.exe’)
url = ‘http://jwc.hut.edu.cn/tzgg.htm’
2.分析页面,爬取数据
2.1 确定要爬取的网址
我们通过分析网址构成,发现不同的页数变的只有数值,而且规律是逐渐递减的,从20到1。
代码如下
# 通告页面有21页,通过分析发现从第二页起,是从20到1构建的
url_list = [url]
for page in range(20, 1, -1):
page_url = f'https://www.bjut.edu.cn/tzgg/{page}.htm'
url_list.append(page_url)
2.2 爬取数据
list = []
for url in url_list:
driver.get(url)
time.sleep(1)
etree = html.etree
resp1 = driver.page_source
tree1 = etree.HTML(resp1)
lis1 = tree1.xpath('/html/body/table[3]/tbody/tr/td[2]/table/tbody/tr[4]/td/div/ul[1]/li')
lis2 = []
# 因为只有奇数次序的标签才是通告的,所有取所有奇数个
for j in range(1, len(lis1), 2):
lis2.append(lis1[j])
for li in lis2:
dic = {}
# 时间
date = li.xpath('./span/text()')[0]
# 网址
detail = li.xpath('./a/@href')[0]
detail_url = 'http://jwc.hut.edu.cn/' + detail
driver.get(detail_url)
time.sleep(1)
# 标题
try:
title = driver.find_element(By.XPATH, '/html/body/table[3]/tbody/tr/td[2]/table/tbody/tr[3]/td/div/div/form/h1').text
except:
continue
# 正文内容
content = driver.find_element(By.XPATH, '/html/body/table[3]/tbody/tr/td[2]/table/tbody/tr[3]/td/div/div/form/div[2]/div/div').text
content = content.replace('\n', '')
# 写入字典
dic['title'] = title
dic['date'] = date
dic['url'] = detail_url
dic['content'] = content
print(dic)
list.append(dic)
我们循环爬取列表中的网址,发现通告内容都是在二级页面的,而且二级页面的网址可以在一级页面中获取,在这里获取时间的话我为了方便是从一级页面获取的,得到二级页面的url后,我们可以通过selenium访问,按下F12,我们可以通过鼠标点击确定想要的信息。这里我们用的是字典结构存储数据,包括时间、标题、正文url、正文等。
3.数据保存到excel
写入xlsx
# 写入xlsx
def write_xlsx(list_a, filenames_xlsx):
header = ['title', 'date', 'url', 'content']
with open(filenames_xlsx, 'w+', encoding='utf-8') as f:
pass
df = pd.read_csv(filenames_xlsx, header=None, names=header)
df.to_excel(filenames_xlsx)
list_d = []
for ele in list_a:
dict_w = {
'title': ele['title'],
'date': ele['date'],
'url': ele['url'],
'content': ele['content']
}
list_d.append(dict_w)
pd.DataFrame(list_d).to_excel(filenames_xlsx, encoding="utf-8", index=False,
header=['title', 'date', 'url', 'content'])
我们通过padas库的方法将字典写入excel中,代码如上,因为时间关系,我们的图片不再奉上。如有写的不好的地方请多多批评,谢谢阅读。