环境: Python 3.7.6+Anaconda3(清华源)+Pycharm(编译器)
涉及到的库: selenium(使用前确保你的浏览器是否装了自动化测试运行浏览器的驱动,例如chromedriver.exe) time(系统自带的库,调整程序运行时间,防止请求过快) bs4(用来解析网页跳转中的源代码) re(正则表达式,根据html源代码匹配基本信息) openpyxl(将数据保存为.xlsx(excel)) pymysql(将数据保存到mysql) 功能阐述: 首先自动打开浏览器,跳转到淘宝网 此刻编译器里弹出: 我们键入"小米":(可以任意键入查找关键词) 接着浏览器跳转到登录界面: pycharm弹出 输入淘宝登录信息: 这时测试手机号异常的情况: 浏览器会先跳转到账户风险的网页,再跳转回登录界面: pycharm提示登录名或密码不正确,这时测试手机号正常,密码错误的情况: 浏览器提示登录名或登录密码不正确,之后会刷新浏览器,可重新输入正确的信息:
成功登录之后程序就在开始自动采集网页100页数据的操作了
但是之后又遇到了以下问题,暂不知道怎么解决(可能是ip出了问题) 几天前的还能爬取。。。
几天后测试又没有那个弹窗了,试运行了下存储到mysql的结果:
完整代码如下:
#coding:utf-8 from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys import time from bs4 import BeautifulSoup import re import pymysql from openpyxl import Workbook name=[]#商品名称 deal=[]#销售情况,购买情况 price=[]#价格 nick=[]#店铺名称 regoin=[]#地区 # 进入浏览器设置 options = webdriver.ChromeOptions() # 设置中文 options.add_argument('lang=zh_CN.UTF-8') # 更换头部 options.add_argument('user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36') # 设置代理 #options.add_argument("--proxy-server=http://58.246.3.178:53281") # 创建浏览器对象 browser=webdriver.Chrome(chrome_options=options) browser.get('https://www.taobao.com/') #主页面 print('请输入想要搜索的商品描述:') search_str=input() search=browser.find_element(By.CSS_SELECTOR,'.search-combobox-input-wrap input') search.send_keys(search_str) search.send_keys(Keys.ENTER) #跳转到登录页面 while(1): print('请输入您的淘宝用户名(手机号):') username=input() print('对应的密码:') passwd=input() username_point=browser.find_element(By.XPATH,'//*[@id="fm-login-id"]') username_point.send_keys(username) passwd_point=browser.find_element(By.XPATH,'//*[@id="fm-login-password"]') passwd_point.send_keys(passwd) denglu=browser.find_element(By.CSS_SELECTOR,'.fm-btn button') denglu.click() text=BeautifulSoup(browser.page_source,'lxml') #登录异常识别 flag = 0 try: if(browser.page_source.find('登录名或登录密码不正确')!=-1): print('登录名或登录密码不正确,请重新输入') browser.refresh() continue except Exception as e: pass else: flag+=1 try: if (browser.page_source.find('你的账户存在安全风险')!=-1): print('登录名或登录密码不正确,请重新输入1') browser.back() browser.refresh() continue except Exception as e: pass else: flag+=1 print(flag) if(flag==2): break time.sleep(2) #商品爬取 def test(): html=browser.page_source soup=BeautifulSoup(html,'lxml') source=soup.prettify()#网页源代码 #商品标题 title=re.findall('"pid":"","title":"(.*?)"',source) #异常字符过滤 for i in title: i = i.replace('\\u003c', '') i = i.replace('span', '') i = i.replace('class', '') i = i.replace('\\u003dH', '') i = i.replace('\\u003e', '') i = i.replace('/', '') i = i.replace('\\u003e', '') name.append(i) #print(name) #销售情况 a=re.findall('"view_sales":"(.*?)"',source) for i in a: if(re.findall('(.*?)万',i)): i=re.findall('(.*?)万',i) i=list(map(float,i)) i=i[0]*1000 deal.append(i) else: i = re.findall('([0-9]*?)\+*人付款', i) i=i[0] i=float(i) deal.append(i) #print(deal) #价格 a=re.findall('"view_price":"(.*?)"',source) for i in a: i=float(i) price.append(i) #print(price) #店铺名称 a=re.findall('"nick":"(.*?)","shopcard":',source) for i in a: nick.append(i) #print(nick) #地区 a=re.findall('"item_loc":"(.*?)"',source) for i in a: regoin.append(i) #print(regoin) def write_excel(): # 将数据导入excel table=Workbook() table_sheet=table.active#激活sheet row0 = ["商品名称", "销售情况", "价格", "店铺名称", "地区"] # 第一行行标题 table_sheet.append(row0) # 列数据 for i in range(1, len(name)+1): table_sheet['A'+str(i+1)]=name[i-1] table_sheet['B' + str(i + 1)] = deal[i - 1] table_sheet['C' + str(i + 1)] = price[i - 1] table_sheet['D' + str(i + 1)] = nick[i - 1] table_sheet['E' + str(i + 1)] = regoin[i - 1] table.save(search_str+'.xlsx') def save_to_mysql(): # ip地址与端口号 host = '127.0.0.1' # 端口号 port = 3008 # 用户名 username = 'root' # 密码 passwd = '' # 连接数据库 conn = pymysql.connect(host=host, port=3308, user=username, passwd=passwd) # 获取游标 cursor = conn.cursor() # 建表,若无foods数据库则创建 cursor.execute(""" create database if not exists foods; """) cursor.execute(""" use foods; """) cursor.execute(""" DROP TABLE IF EXISTS information; """) cursor.execute(""" create table information( `商品名称` varchar(100), `销售情况` decimal(10,2), `价格` decimal(10,2), `店铺名称` varchar(100), `地区` varchar(100) )character set utf8; """) for i in range(0,len(name)): sql="insert into information values("+"\'"+name[i]+"\'"+","+str(deal[i])+","+str(price[i])+","+"\'"+str(nick[i])+"\'"+","+"\'"+str(regoin[i])+"\'"")" cursor.execute(sql) conn.commit() #提交任务,数据才会写入数据库 if __name__ == '__main__': for i in range(1,101): if(i==1): test() else: yema_input=browser.find_element(By.XPATH,'//*[@id="mainsrp-pager"]/div/div/div/div[2]/input')#页码输入框 browser.execute_script("arguments[0].scrollIntoView();", yema_input) # 拖动到可见的元素去 time.sleep(2) yema_input.send_keys(Keys.ENTER) test() save_to_mysql() #write_excel() browser.close()