Selenium抓取淘宝商品信息实战练习 携带Cookie登录

鳄鱼君Ba

发表文章数:519

热门标签

Vieu四代商业主题

高扩展、安全、稳定、响应式布局多功能模板。

¥69 现在购买
首页 » Python教程 » Selenium抓取淘宝商品信息实战练习 携带Cookie登录

对淘宝商品的信息进行提取,首先导入需要的模块,基本都是使用的下面的几个模块:

from selenium import webdriver # 基本的模块
from selenium.common.exceptions import TimeoutException # 超时报错
from selenium.webdriver.common.by import By # 基本的元素查找
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait # 设置等待时间,超出时间就会触发 超时报错
from urllib.parse import quote # 将中文转码为url地址
from pyquery import PyQuery # 数据解析模块

鳄鱼君Ba这里使用pyquery来解析数据,当然你也可以使用其它的解析模块。然后我么这里以女装作为演示。

KEYWORD='女装'
browser=webdriver.Chrome('驱动器路径') # 我直接放在了python.exe目录下,所以可以不写路径
wait= WebDriverWait(browser,10) # 设置超时等待时间

基本上所有的网站,都会有滑动验证码,如果你通过selenium自动输入用户名和密码登录,它会认为你就是一个机器人,所以肯定会出现验证码。对于滑动验证,selenium实现起来比较麻烦,代码也不易理解,更好的办法就是通过Cookie,方便又简单!

获取cookie的方法很多,可以通过selenium自带的get_cookies()来获取,也可以通过requests模块,携带登录参数登录并获取到cookie,当然你也可以通过手动复制登录过后的cookie。这里复制的cookie是请求头中的Cookie,需要进行cookie替换:

str='浏览器请求头中复制的cookie  '
str.replace('"','') #替换"为空,这个没用上
str_list=str.split(';')  #通过;分割为列表list

cookie_list=[]
for item in str_list:  #通过循环取出元素
    name_value={}
    name_value['name']=item.split('=')[0].strip()
    name_value['value']=item.split('=')[1]

    cookie_list.append(name_value) #添加到我们的cookie_list

print(cookie_list)#输出,一行排版可以换行

selenium携带的cookie格式为字典类型,每个字典必须有name和value两个键:{name:’ ‘,value:’ ‘} ,就是这种字典格式,当然不仅仅只有这两个。可以使用以上脚本进行转换,然后通过循环添加即可!

鳄鱼君Ba在这里,准备通过手动扫码登录,然后保存cookie到本地,下次登录直接从本地获取cookie登录。这种方式只需要扫码一次即可,相比于复杂的滑动验证码来说,再简单不过了!获取cookie代码参考:

def get_cookie():
    login_url='https://login.taobao.com/member/login.jhtml'
    browser=webdriver.Chrome()
    browser.maximize_window() # 最大化浏览器窗口
    browser.get(login_url)
    time.sleep(15)
    dic_cookie=browser.get_cookies()
    str_cookie=json.dumps(dic_cookie)
    dic_cookie=re.sub('"expiry":.*?,','',str_cookie) # 剔除过期时间的属性
    with open('./tao_bao_cookie.txt','w',encoding='utf-8') as f:
        f.write(dic_cookie)
get_cookie()

如果cookie中存在expiry,必须要替换掉,这个是设置cookie到期时间的。运行代码,我们使用扫码登录之后,就可以将cookie保存到本地,下次可以直接读取。淘宝的cookie的过期时间大约几个小时,几个小时过后还需要重新扫码登录获取cookie

接下来从文件中读取cookie,先打开淘宝首页,然后携带cookie打开我们搜索的页面:

def add_cookie():
    browser=webdriver.Chrome()
    browser.maximize_window() # 最大化浏览器窗口
    browser.get('https://www.taobao.com/')
    with open('./tao_bao_cookie.txt','r',encoding='utf-8') as f:
        tao_cookie=json.loads(f.read())
    for item in tao_cookie:
        browser.add_cookie(item)
    KEYWORD='女装'
    url='https://s.taobao.com/search?q='+quote(KEYWORD)
    browser.execute_script('window.open()')  # 采用js打开新的标签页
    browser.switch_to.window(browser.window_handles[1])  # 切换到第二个标签页
    browser.get(url)
    print(browser.page_source)
add_cookie()

如果报错:selenium.common.exceptions.InvalidCookieDomainException: Message: invalid cookie domain,就是你先添加cookie,然后再打开url,不能这样做!代码中是先打开淘宝首页,然后读取cookie并添加,打开新的标签窗口就会显示登录后的页面,最后打印一下网页的源码,基本可以得到数据,接下来是信息的提取。

先明确一点,获取page_source之后需要进行数据解析。这里你需要在selenium打开的淘宝中进行数据的查询提取,不要在浏览器中的淘宝页面进行数据的查询提取,两者是有区别的,淘宝设置了反爬,两者的源代码不同!

翻页需要在当前页面进行,而不要重新打开标签窗口,翻页频率不宜过快,会弹出滑动验证码,这个滑动验证码就会终结你的程序!无论你如何滑动都不会成功的

修改add_cookie函数:

def add_cookie(page):
    browser=webdriver.Chrome()
    browser.maximize_window() # 最大化浏览器窗口
    wait=WebDriverWait(browser,10)
    browser.get('https://www.taobao.com/')
    with open('./tao_bao_cookie.txt','r',encoding='utf-8') as f:
        tao_cookie=json.loads(f.read())
    for item in tao_cookie:
        browser.add_cookie(item)
    KEYWORD='女装'
    url='https://s.taobao.com/search?q='+quote(KEYWORD)
    browser.execute_script('window.open()')  # 采用js打开新的标签页
    browser.switch_to.window(browser.window_handles[1])  # 切换到第二个标签页
    browser.get(url)
    with open('tao.html', 'w', encoding='utf-8') as f:
        f.write(browser.page_source)
    # 翻页
    for i in range(int(page)):
        if i > 1:
            # 页码输入框
            try:
                page_box = wait.until(
                    EC.presence_of_element_located(
                        (By.CSS_SELECTOR, '#mainsrp-pager > div > div > div > div.form > input')
                    )
                )
                # 页码点击框
                page_bottom = wait.until(
                    EC.element_to_be_clickable(
                        (By.CSS_SELECTOR, '#mainsrp-pager > div > div > div > div.form > span.btn.J_Submit')
                    )
                )
                page_box.clear()  # 清空页码输入框
                page_box.send_keys(str(i))  # 发送页码
                page_bottom.click()  # 点击确定按钮
                time.sleep(20) # 翻页等待
            except TimeoutException as e:
                pass
        #等待一定的时间(时间为wait的时间),直到通过css选择器能在页面找到某个元素,如果超时还没有找到就继续向后执行
        wait.until(
            EC.presence_of_element_located(
                (By.CSS_SELECTOR,'#mainsrp-itemlist .items .item')
            )
        )
        html = browser.page_source # 获取网页的源码
        parse_data(html)

def parse_data(html):
    doc = PyQuery(html)
    data = {} # 创建一个字典用于存储数据
    items = doc('#mainsrp-itemlist .items .item').items()
    for item in items:
        data['img'] = 'http:' + re.sub('_230x230.jpg', '', item.find('.pic .img').attr('data-src')) # 替换掉图片尺寸
        data['price'] = item.find('.price').text()
        data['title'] = item.find('.title').text()
        data['people'] = item.find('.deal-cnt').text()
        data['shop'] = item.find('.shop').text()
    with open('./tao_tao_data.json','w',encoding='utf-8') as f:
        f.write(json.dumps(data)+'\n')
if __name__ == '__main__':
    html=add_cookie(100)

也可以存储到mongodb中:

from pymongo import MongoClient
def save_to_mongo(data):
    client=MongoClient('127.0.0.1',port=27017)
    database=client.TaoBao #创建数据库
    collection=database.taobao # 数据库集合名字
    collection.insert_one(data)
    print('存储到mongo数据库成功')

到此就实现了淘宝商品信息的抓取,这里只是存储为json文件,也可以存储为其他格式。cookie过5个小时左右就会过去,这个只能重新扫码获取了。现在还有一个棘手的问题,就是翻页频繁会出现滑动验证码,手动也好自动也好,都会出现滑块验证失败的!所以你需要设置合适的时间延时,或者更换代理,这里不过多介绍!

标签:

未经允许不得转载:作者:鳄鱼君Ba, 转载或复制请以 超链接形式 并注明出处 鳄鱼君Ba
原文地址:《Selenium抓取淘宝商品信息实战练习 携带Cookie登录》 发布于2020-05-19

分享到:
赞(0) 赏杯咖啡

评论 抢沙发

9 + 4 =


文章对你有帮助可赏作者一杯咖啡

支付宝扫一扫打赏

微信扫一扫打赏

Vieu4.6主题
专业打造轻量级个人企业风格博客主题!专注于前端开发,全站响应式布局自适应模板。
切换注册

登录

忘记密码 ?

您也可以使用第三方帐号快捷登录

Q Q 登 录
微 博 登 录
切换登录

注册