环境:
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()