关于多页面selenium爬取存储
目标网站:https://china.nba.com/playerindex/
爬取所有球员的信息:对目标网站进行分析的时候切换网页url不会变化,并且网页内容也不变
使用selenium模拟登录爬取数据:
from selenium import webdriver from lxml import etree import pandas as pd import json import time browser=webdriver.Chrome() try: browser.get("https://china.nba.com/playerindex/") wait=WebDriverWait(browser,10) #分析页面的信息,发现从A到Z字母开头的人名,只是将最后的xpath改为了对应的字母位数,因此我们拼接出相应的xpath对应页面,点击获取信息 for i in range(1,27): path = '//*[@id="main-container"]/div/div[2]/div[2]/section/div/div/div/div/div[3]/div[2]/div[2]/'+'div['+str(i)+']'
#找到xpath点击 browser.find_element_by_xpath(path).click()
#找到第一个列表,也就是相应的球员信息表 df = pd.read_html(browser.page_source)[0]
#导出为csv文件 df.to_csv('std'+str(i)+'.csv', index=False) time.sleep(10) finally: browser.close()
因为我还没有找到将每一页的列表都存在一个csv文件的方法,因此我只能用笨方法。生成了26个csv文件,然后将他们存到一个csv文件里面
import pandas as pd import os la = [] for i in range(1,27): path = 'std' + str(i) +'.csv' la.append(path) for inputfile in la: pf = pd.read_csv(inputfile,header = None) pf.to_csv('all.csv',mode='a',index=False,header=False)
此处的路径你需要重新的设置,这样生成一个大的csv文件,那么进行导入数据库,当然我不是说的手动导入
xlrd模块支持将lxs表格导入到数据库,因此我想的是将csv文件转换成xls文件
from io import StringIO import csv import pandas as pd c_path = r"C:\Users\23990\Desktop\all.csv" x_path = r"C:\Users\23990\Desktop\xxx.xls" # 路径中的xls文件在调用to_excel时会自动创建 def csv_to_xls(csv_path, xls_path): with open(csv_path, 'r', encoding='gb18030', errors='ignore') as f: data = f.read() data_file = StringIO(data) print(data_file) csv_reader = csv.reader(data_file) list_csv = [] for row in csv_reader: list_csv.append(row) df_csv = pd.DataFrame(list_csv).applymap(str) ''' 这部分是不将csv装换为xls,而是过滤后再写入csv文件 df_csv = df_csv[(df_csv[4] == '') | (df_csv[4] == 'name')] # 过滤出第四列包含空值和name的数据 df_csv.to_csv(csv_path, index=0, header=0, encoding='gb18030') # 写入csv文件中 ''' writer = pd.ExcelWriter(xls_path) # 写入Excel df_csv.to_excel( excel_writer=writer, index=False, header=False ) writer.save() csv_to_xls(c_path, x_path)
最后导入数据库,完美,此方法在Windows环境完全正常运行,在Mac版本还没有尝试,等到我找到新的方法在讲