基于selenium的爬取淘宝商品基本信息的代码(很菜,勿喷)

环境:
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()
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值