数据爬取
使用的工具:pycharm
使用的技术/包:python/selenium-csv
爬虫项目讲解
我做的是爬取陶之表的高职高专爬虫代码
我们要爬取的就是这个网站:陶之表
我们的爬取的内容是:2019-2021年的电子信息类下面的电子信息类、统计类、计算机类、通信类,四个大类的数据。
代码分析
先把代码发放上来,然后我根据代码逐步解析
from selenium import webdriver
import csv
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_experimental_option("debuggerAddress", "127.0.0.1:9222")
chrome_driver = r'C:\Program Files\Google\Chrome\Application\chromedriver.exe'
driver = webdriver.Chrome(chrome_driver, chrome_options=chrome_options)
driver.get('https://www.taolists.com/site/dashboardmajorprojectedandreal')
driver.implicitly_wait(10)
p = 2019
def get_data():
driver.find_element_by_xpath('//*[@id="dip"]').click()
driver.implicitly_wait(10)
list2 = ['3', '1', '2']
for ii in list2:
list1 = []
list22 = []
list3 = []
list4 = []
driver.find_element_by_xpath('//*[@id="tree1_' + ii + '"]/li[18]/div[1]/span/span').click()
driver.find_element_by_xpath('//*[@id="tree1_' + ii + '"]/li[18]/ul/li[1]/div[1]/span/span').click()
kk3 = driver.find_elements_by_xpath('//*[@id="tree1_' + ii + '"]/li[18]/ul/li[1]/ul/li/span/span')
print('电子信息类' + str(p))
for i in kk3:
list1.append(i.get_attribute('innerText').split())
driver.find_element_by_xpath('//*[@id="tree1_' + ii + '"]/li[18]/ul/li[2]/div[1]/span/span').click()
kk3 = driver.find_elements_by_xpath('//*[@id="tree1_' + ii + '"]/li[18]/ul/li[2]/ul/li/span/span')
print('统计类' + str(p))
for i in kk3:
list22.append(i.get_attribute('innerText').split())
driver.find_element_by_xpath('//*[@id="tree1_' + ii + '"]/li[18]/ul/li[3]/div[1]/span/span').click()
kk3 = driver.find_elements_by_xpath('//*[@id="tree1_' + ii + '"]/li[18]/ul/li[3]/ul/li/span/span')
print('计算机类' + str(p))
for i in kk3:
list3.append(i.get_attribute('innerText').split())
driver.find_element_by_xpath('//*[@id="tree1_' + ii + '"]/li[18]/ul/li[4]/div[1]/span/span').click()
kk3 = driver.find_elements_by_xpath('//*[@id="tree1_' + ii + '"]/li[18]/ul/li[4]/ul/li/span/span')
print('通信类' + str(p))
for i in kk3:
list4.append(i.get_attribute('innerText').split())
save_csv(list1,list22,list3,list4)
def save_csv(list1,list22,list3,list4):
max = len(list1)
list5 = [len(list22),len(list3),len(list4)]
for i in range(len(list5)):
if list5[i] > max:
max = list5[i]
global p
print('=' * 50 + '保存' + str(p) + '年' + '=' * 50)
with open(r'C:\Users\z\Desktop\数据' + str(p) + '.csv', 'w', encoding='utf-8', newline='') as f:
csv_writer = csv.writer(f)
csv_writer.writerow(["电子信息类", '电子信息类_数字','统计类','统计类_数字','计算机类','计算机类_数字','通信类','通信类_数字'])
for uu in range(max):
try:
print(list1[uu][0])
except:
list1.append(['空','空'])
print(list1[uu][0])
print(list1[uu][1].replace("(", '').replace(')', ''))
try:
print(list22[uu][0])
except:
list22.append(['空','空'])
print(list22[uu][0])
print(list22[uu][1].replace("(", '').replace(')', ''))
try:
print(list3[uu][0])
except:
list3.append(['空','空'])
print(list3[uu][0])
print(list3[uu][1].replace("(", '').replace(')', ''))
try:
print(list4[uu][0])
except:
list4.append(['空','空'])
print(list4[uu][0])
print(list4[uu][1].replace("(", '').replace(')', ''))
csv_writer.writerow([list1[uu][0], list1[uu][1].replace("(", '').replace(')', ''),list22[uu][0], list22[uu][1].replace("(", '').replace(')', ''),list3[uu][0], list3[uu][1].replace("(", '').replace(')', ''),list4[uu][0], list4[uu][1].replace("(", '').replace(')', '')])
print('成功')
p = p + 1
if __name__ == '__main__':
get_data()
下面我根据代码,从下到下给大家讲解分析一遍
导包
from selenium import webdriver
import csv
from selenium.webdriver.chrome.options import Options
这里就不细说,只是简单的导包
使用同一个浏览器和Get获取网站
chrome_options = Options()
chrome_options.add_experimental_option("debuggerAddress", "127.0.0.1:9222")
chrome_driver = r'C:\Program Files\Google\Chrome\Application\chromedriver.exe'
driver = webdriver.Chrome(chrome_driver, chrome_options=chrome_options)
driver.get('https://www.taolists.com/site/dashboardmajorprojectedandreal')
driver.implicitly_wait(10)
在写程序的过程中发现由于selenium包的默认情况下,每运行一次程序就会打开一个新的浏览器,这样既不方便又损耗性能。
所以在网上找了教程,【Python】Selenium一直使用同一个浏览器,不重复开浏览器_Hurpe-CSDN博客
最后一行是隐形等待 ,由于陶之表的网站速度访问有点慢,所以需要等上一定的时间,但是具体等待多长时间就不是很清楚,所以就使用隐形等待 。
隐形等待:给定一个等待时间,如果在这个时间内程序加载好,那么就取消等待,执行下面的程序。
取出想要的数据
def get_data():
driver.find_element_by_xpath('//*[@id="dip"]').click()
driver.implicitly_wait(10)
list2 = ['3', '1', '2']
for ii in list2:
list1 = []
list22 = []
list3 = []
list4 = []
driver.find_element_by_xpath('//*[@id="tree1_' + ii + '"]/li[18]/div[1]/span/span').click()
driver.find_element_by_xpath('//*[@id="tree1_' + ii + '"]/li[18]/ul/li[1]/div[1]/span/span').click()
kk3 = driver.find_elements_by_xpath('//*[@id="tree1_' + ii + '"]/li[18]/ul/li[1]/ul/li/span/span')
print('电子信息类' + str(p))
for i in kk3:
list1.append(i.get_attribute('innerText').split())
driver.find_element_by_xpath('//*[@id="tree1_' + ii + '"]/li[18]/ul/li[2]/div[1]/span/span').click()
kk3 = driver.find_elements_by_xpath('//*[@id="tree1_' + ii + '"]/li[18]/ul/li[2]/ul/li/span/span')
print('统计类' + str(p))
for i in kk3:
list22.append(i.get_attribute('innerText').split())
driver.find_element_by_xpath('//*[@id="tree1_' + ii + '"]/li[18]/ul/li[3]/div[1]/span/span').click()
kk3 = driver.find_elements_by_xpath('//*[@id="tree1_' + ii + '"]/li[18]/ul/li[3]/ul/li/span/span')
print('计算机类' + str(p))
for i in kk3:
list3.append(i.get_attribute('innerText').split())
driver.find_element_by_xpath('//*[@id="tree1_' + ii + '"]/li[18]/ul/li[4]/div[1]/span/span').click()
kk3 = driver.find_elements_by_xpath('//*[@id="tree1_' + ii + '"]/li[18]/ul/li[4]/ul/li/span/span')
print('通信类' + str(p))
for i in kk3:
list4.append(i.get_attribute('innerText').split())
save_csv(list1,list22,list3,list4)
陶之表网站默认是本科所以需要点击到高职高专
driver.find_element_by_xpath('//*[@id="dip"]').click()
随后就是等待,等待完毕之后的列表是三年的xpath数值的不同进行的创建。
我们需要点击电子信息类 之后才会出现四大类,所以首先点击电子信息类 。
driver.find_element_by_xpath('//*[@id="tree1_' + ii + '"]/li[18]/div[1]/span/span').click()
随后是四大类。
driver.find_element_by_xpath('//*[@id="tree1_' + ii + '"]/li[18]/ul/li[1]/div[1]/span/span').click()
kk3 = driver.find_elements_by_xpath('//*[@id="tree1_' + ii + '"]/li[18]/ul/li[1]/ul/li/span/span')
print('电子信息类' + str(p))
for i in kk3:
list1.append(i.get_attribute('innerText').split())
driver.find_element_by_xpath('//*[@id="tree1_' + ii + '"]/li[18]/ul/li[2]/div[1]/span/span').click()
kk3 = driver.find_elements_by_xpath('//*[@id="tree1_' + ii + '"]/li[18]/ul/li[2]/ul/li/span/span')
print('统计类' + str(p))
for i in kk3:
list22.append(i.get_attribute('innerText').split())
driver.find_element_by_xpath('//*[@id="tree1_' + ii + '"]/li[18]/ul/li[3]/div[1]/span/span').click()
kk3 = driver.find_elements_by_xpath('//*[@id="tree1_' + ii + '"]/li[18]/ul/li[3]/ul/li/span/span')
print('计算机类' + str(p))
for i in kk3:
list3.append(i.get_attribute('innerText').split())
driver.find_element_by_xpath('//*[@id="tree1_' + ii + '"]/li[18]/ul/li[4]/div[1]/span/span').click()
kk3 = driver.find_elements_by_xpath('//*[@id="tree1_' + ii + '"]/li[18]/ul/li[4]/ul/li/span/span')
print('通信类' + str(p))
for i in kk3:
list4.append(i.get_attribute('innerText').split())
这里之所以不会去用循环减少代码量,是因为很直观的显示出来爬取那个类。
最后调用保存数据的函数。
save_csv(list1,list22,list3,list4)
保存数据
def save_csv(list1,list22,list3,list4):
max = len(list1)
list5 = [len(list22),len(list3),len(list4)]
for i in range(len(list5)):
if list5[i] > max:
max = list5[i]
global p
print('=' * 50 + '保存' + str(p) + '年' + '=' * 50)
with open(r'C:\Users\z\Desktop\数据' + str(p) + '.csv', 'w', encoding='utf-8', newline='') as f:
csv_writer = csv.writer(f)
csv_writer.writerow(["电子信息类", '电子信息类_数字','统计类','统计类_数字','计算机类','计算机类_数字','通信类','通信类_数字'])
for uu in range(max):
try:
print(list1[uu][0])
except:
list1.append(['空','空'])
print(list1[uu][0])
print(list1[uu][1].replace("(", '').replace(')', ''))
try:
print(list22[uu][0])
except:
list22.append(['空','空'])
print(list22[uu][0])
print(list22[uu][1].replace("(", '').replace(')', ''))
try:
print(list3[uu][0])
except:
list3.append(['空','空'])
print(list3[uu][0])
print(list3[uu][1].replace("(", '').replace(')', ''))
try:
print(list4[uu][0])
except:
list4.append(['空','空'])
print(list4[uu][0])
print(list4[uu][1].replace("(", '').replace(')', ''))
csv_writer.writerow([list1[uu][0], list1[uu][1].replace("(", '').replace(')', ''),list22[uu][0], list22[uu][1].replace("(", '').replace(')', ''),list3[uu][0], list3[uu][1].replace("(", '').replace(')', ''),list4[uu][0], list4[uu][1].replace("(", '').replace(')', '')])
print('成功')
p = p + 1
我们要保存数据就需要遍历列表,但是由于四大类的数据数量的不同导致长度也不同,所以需要找出最长列表的长度,进行遍历。
max = len(list1)
list5 = [len(list22),len(list3),len(list4)]
for i in range(len(list5)):
if list5[i] > max:
max = list5[i]
随后就是创建目录进行保存。
with open(r'C:\Users\z\Desktop\数据' + str(p) + '.csv', 'w', encoding='utf-8', newline='') as f:
csv_writer = csv.writer(f)
csv_writer.writerow(["电子信息类", '电子信息类_数字','统计类','统计类_数字','计算机类','计算机类_数字','通信类','通信类_数字'])
开始保存。
for uu in range(max):
try:
print(list1[uu][0])
except:
list1.append(['空','空'])
print(list1[uu][0])
print(list1[uu][1].replace("(", '').replace(')', ''))
try:
print(list22[uu][0])
except:
list22.append(['空','空'])
print(list22[uu][0])
print(list22[uu][1].replace("(", '').replace(')', ''))
try:
print(list3[uu][0])
except:
list3.append(['空','空'])
print(list3[uu][0])
print(list3[uu][1].replace("(", '').replace(')', ''))
try:
print(list4[uu][0])
except:
list4.append(['空','空'])
print(list4[uu][0])
print(list4[uu][1].replace("(", '').replace(')', ''))
csv_writer.writerow([list1[uu][0], list1[uu][1].replace("(", '').replace(')', ''),list22[uu][0], list22[uu][1].replace("(", '').replace(')', ''),list3[uu][0], list3[uu][1].replace("(", '').replace(')', ''),list4[uu][0], list4[uu][1].replace("(", '').replace(')', '')])
print('成功')
由于4大类长度的不同,就会报出列表长度超出的错误,所以使用异常try 进行处理。
最后是年的增加。
p = p + 1
结束
本篇文章讲解到这里啦。
|