首页 > 其他分享 >【爬虫】项目篇-使用selenium、requests爬取天猫商品评论

【爬虫】项目篇-使用selenium、requests爬取天猫商品评论

时间:2024-04-05 23:11:56浏览次数:29  
标签:name 取天 driver id import requests element login selenium

目录

使用selenium

from selenium.webdriver import Chrome,ChromeOptions
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
import pymongo
import time
import random

class GetCookies():
    def GetCookies(self):
        username="ho0"
        password="hon5"

        #login_url="https://login.tmall.com/"
        login_url="https://login.taobao.com/member/login.jhtml?redirectURL=http%3A%2F%2Flist.tmall.com%2Fsearch_product.htm%3Fq%3D%25E8%258B%25B9%25E6%259E%259C%26type%3Dp%26vmarket%3D%26spm%3D875.7931836%252FB.a2227oh.d100%26from%3Dmallfp..pc_1_searchbutton&uuid=9b1b940679de3c3820589302ff75920b"
        driver.get(login_url)
        WebDriverWait(driver, 10).until(
            EC.presence_of_element_located((By.XPATH, '//*[@id="fm-login-id"]')))
        login_name=driver.find_element_by_xpath('//*[@id="fm-login-id"]')
        login_name.click()
        login_name.send_keys(username)

        time.sleep(random.randrange(5,7))

        login_passwd=driver.find_element_by_xpath('//*[@id="fm-login-password"]')
        login_passwd.click()
        login_passwd.send_keys(password)
        time.sleep(random.randrange(5,7))

        driver.find_element_by_xpath('//*[@id="login-form"]/div[4]/button').click()
        search_url="https://detail.tmall.com/item.htm?spm=a220m.1000858.1000725.1.193a74a7Gjoc16&id=656168531109&skuId=4902176242110&user_id=1917047079&cat_id=2&is_b=1&rn=96d6ce4c6e59b759d99176e5933c5e1f"
        driver.get(search_url)


class TamllComment():
    def GetCommentData(self):
        goods_url="https://detail.tmall.com/item.htm?spm=a220m.1000858.1000725.1.193a74a7Gjoc16&id=656168531109&skuId=4902176242110&user_id=1917047079&cat_id=2&is_b=1&rn=96d6ce4c6e59b759d99176e5933c5e1f"
        driver.get(goods_url)

        username="ho"
        password="hon"
        WebDriverWait(driver, 10).until(
            EC.presence_of_element_located((By.XPATH, '//*[@id="fm-login-id"]')))
        login_name=driver.find_element_by_xpath('//*[@id="fm-login-id"]')
        login_name.click()
        login_name.send_keys(username)

        time.sleep(random.randrange(5,7))

        login_passwd=driver.find_element_by_xpath('//*[@id="fm-login-password"]')
        login_passwd.click()
        login_passwd.send_keys(password)
        time.sleep(random.randrange(5,7))

        driver.find_element_by_xpath('//*[@id="login-form"]/div[4]/button').click()



    def SaveAsMongo(self):
        pass

if __name__ == '__main__':

    options = ChromeOptions()
    options.add_argument(
        'user-agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36"')
    driver = Chrome(options=options)
    driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
        "source": """
        Object.defineProperty(navigator, 'webdriver', {
          get: () => undefined
        })
      """
    })
    #获取cookies
    #cookies=GetCookies().GetCookies()
    cookies=[{'domain': '.taobao.com', 'expiry': 1653840540, 'httpOnly': False, 'name': 'tfstk', 'path': '/', 'secure': False, 'value': 'cQnABVw_LQA0_Bw-LqLoflTjbiphayBYstNOXLwWsq2FZdsOfs2mxDCKIEwaTSpR.'}, {'domain': '.taobao.com', 'expiry': 2269008541, 'httpOnly': False, 'name': 'cna', 'path': '/', 'sameSite': 'None', 's'}]






from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC

from selenium.common.exceptions import NoSuchElementException

import time
import re
import json
import random

if __name__ == '__main__':
    driver = webdriver.Chrome()
    driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
        "source": """Object.defineProperty(navigator, 'webdriver', {get: () => undefined})""",
    })

    driver.maximize_window()
    driver.get('https://s.taobao.com/')
    key = '华为手机'
    try:
        WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, '//input[@class="search-combobox-input"]')))
        input_box = driver.find_element_by_class_name('search-combobox-input')
        print(type(input_box))
        input_box.send_keys(key)
        driver.find_element_by_class_name('btn-search').click()
        try:
            WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, '//div[@ID="container"]')))
            # 登录
            with open('taobao_user_info') as fp:
                user_info = fp.read().split()
                user_name = user_info[0]
                password = user_info[1]
                driver.find_element_by_id('fm-login-id').send_keys(user_name)
                driver.find_element_by_id('fm-login-password').send_keys(password)
                driver.find_element_by_class_name('fm-btn').click()
        finally:
            time.sleep(random.randint(5,10))
            # 提取商品信息
            source = driver.page_source
          #  print(source)
            match_result = re.search(r'g_page_config =(.*?)g_srp_loadCss', source, flags=re.S)   # 需使用u得到
           # print(match_result.group(1))
           # print(match_result.group(1).rstrip().rstrip(';'))
            item_json = json.loads(match_result.group(1).rstrip().rstrip(';'))
            print(item_json['mods']['itemlist']['data']['auctions'])

            i = 44
            while True:
                try:
                    driver.find_element_by_link_text('下一页').click()
                #    window = driver.current_window_handle
                    time.sleep(random.randint(5,10))
                    # 提取商品信息
                    js = 'window.scrollTo(0,document.body.scrollHeight)' #"var q=document.documentElement.scrollTop=1000"
                    driver.execute_script(js)
                    time.sleep(random.randint(5,10))
                    i += 44
                    driver.get(f"https://s.taobao.com/search?q={key}&s={i}")
                    source = driver.page_source
                    #  print(source)
                    match_result = re.search(r'g_page_config =(.*?)g_srp_loadCss', source, flags=re.S)  # 需使用u得到
                    # print(match_result.group(1))
                    # print(match_result.group(1).rstrip().rstrip(';'))
                    item_json = json.loads(match_result.group(1).rstrip().rstrip(';'))
                    print(item_json['mods']['itemlist']['data']['auctions'])

                except NoSuchElementException:
                    break

    except Exception as e:
        print('等待时间不够?还是其它异常')
    finally:
        driver.quit()


使用requests

import requests
from fake_useragent import UserAgent
import time
import random
import json
import redis
import openpyxl

def get_comment_data(start_page,end_page):

    url="https://rate.tmall.com/list_detail_rate.htm?"
    headers={
        'user-agent':UserAgent().ie,
        'cookie':'miid=4159704271564039423; cna=PMcSGlbGqDMCAXBvBSW1loSM; lid=hon; t=d33712a517f185cc4bc07f7e794e1c6a; tracknick=hone; lgc=ho0; enc=VIpLpF8/bb0v918fNc3kxn3fkXLRs7l0lJBEagrAtKl3BvVLNJ11PWm9yq/rtp1xwjNeORedsaJ0Ydu2F8OSDw==; _tb_token_=e3be35e037e4d; cookie2=1f5ad1c8e7ef467d07965d7cf008424d; xlly_s=1; _m_h5_tk=6b2f51112de120902a775b6f6c071c9c_1638285939290; ',
        'referer':'https://detail.tmall.com/item.htm?spm=a220m.1000858.1000725.1.47d174a7SwNZMX&id=656168531109&skuId=4902176242110&areaId=350100&user_id=1917047079&cat_id=2&is_b=1&rn=2a13cc7d543f8f0ff8e7d9492fc4d3b9'
    }

    while start_page<=end_page:
        params={
            'itemId':'656168531109',
            'sellerId':'1917047079',
            'order':'3',
            'currentPage':start_page
        }
        source=requests.get(url,headers=headers,params=params).text
        #print(source)

        #解析数据
        parse_comment_data(source)
        # with open('iphone%d.txt'%start_page,'w',encoding='utf-8') as file:
        #     file.write(source)
        time.sleep(random.randint(5, 8))
        start_page+=1

def parse_comment_data(source):

    comment_data=source.replace("jsonp128(","").replace(")","").replace("\n","")
    comment_data=json.loads(comment_data)
    for data in comment_data["rateDetail"]["rateList"]:

        #用户名
        username=data['displayUserNick']
        #商品类型
        goods_type=data['auctionSku']
        #评论
        content=data['rateContent']
        #日期
        date=data['rateDate']
        # 追加评论和日期
        try:
            add_content = data['appendComment']['content']
            add_content_date = data['appendComment']['commentTime']
        except:
            add_content = ""
            add_content_date=""
        print(username,goods_type,content,date,add_content,add_content_date)
        datalist.append([username,goods_type,content,date,add_content,add_content_date])


def save_as_redis(datalist):
    client = redis.Redis(host="localhost", port=6379, decode_responses=True, db=0)
    for data in datalist:
        data_dict = dict(zip(colnames, data))
        client.rpush('Tmall_iphone',data_dict)
    client.close()

def save_as_excel():
    wb = openpyxl.Workbook()
    ws = wb.active
    ws.append(colnames)
    for data in datalist:
        ws.append(data)
    wb.save('Tmall_iphone.xlsx')
    wb.close()

if __name__ == '__main__':
    datalist=[]
    colnames=['用户名','商品类型','评论内容','日期','追评','追评日期']
    #爬取iphone 1-7页的评论
    get_comment_data(1,7)
    print(datalist)
    save_as_excel()


保存结果:

标签:name,取天,driver,id,import,requests,element,login,selenium
From: https://www.cnblogs.com/Gimm/p/18116532

相关文章

  • selenium框架之无头浏览器
    一、无头浏览器介绍无头浏览器(HeadlessBrowser)是一种没有图形用户界面(GUI)的网络浏览器,它可以在后台运行并执行网页操作,而不需要打开一个可见的浏览器窗口。无头浏览器可以模拟用户在浏览器中执行的各种操作,例如加载网页、点击链接、填写表单等,但所有这些操作都在不可见的情况下......
  • selenium框架之浏览器页面操作
    一、页面操作首先,前期我们将Chrome驱动添加到环境变量了,所以我们可以直接初始化界面。fromseleniumimportwebdriver#初始化浏览器为chrome浏览器driver=webdriver.Chrome().........#关闭浏览器driver.close()Selenium是一个用于自动化浏览器操作的工具,可以用于......
  • selenium框架之介绍与安装
    一、selenium的介绍Selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开发的,Selenium可以直接运行在浏览器上,它支持所有主流的浏览器。因为Selenium可以控制浏览器发送请求,并获取网页数据,因此可以应用于爬虫领域。Selenium可以根据我们的指令,让浏览器自动加载页面,......
  • 12、selenium框架之Cookie操作
    一、查看浏览器cookiecookie、session、token的区别:cookie存储在浏览器本地客户端,发送的请求携带cookie时可以实现登录操作。session存放在服务器。token应用于应用程序。F12查看浏览器cookie:二、cookie基本操作1、获取cookie:fromseleniumimportwebdriverfromsele......
  • selenium框架之动作链
    Selenium框架中的动作链(ActionChains)是一种用于执行复杂用户交互操作的方法。通过使用动作链,可以模拟鼠标操作、键盘操作和其他复杂的用户交互行为。这对于处理拖放、鼠标悬停、键盘按键组合等操作非常有用。比如:对于输入框,我们就调用它的输入文字和清空文字方法;对于按钮,就调......
  • Python进阶:使用requests库轻松发送HTTP请求并获取响应
    Python进阶:使用requests库轻松发送HTTP请求并获取响应简介:本文将带您深入了解Python中强大的requests库,学会如何使用它发送各种HTTP请求,并轻松获取响应内容。无论您是初学者还是有一定经验的Python开发者,本文都将为您提供实用、详细的指导,助您在网络请求与响应的处理上更上......
  • 《手把手教你》系列技巧篇(六十九)-java+ selenium自动化测试 - 读取csv文件(详细教程)
    1.简介 在实际测试中,我们不仅需要读取Excle,而且有时候还需要读取CSV类的文件。如何去读取CSV的文件,宏哥今天就讲解和分享一下,希望对你能够有所帮助。前面介绍了如何读取excel文件,本篇介绍如何读取vsc文件,同样需要用到第三方lib去处理读取csv文件的数据。2.什么是CSV?csv是【......
  • 《手把手教你》系列技巧篇(七十)-java+ selenium自动化测试-Java中如何读取properties配
     1.简介Java自动化测试开发中,需要将一些易变的配置参数放置再XML配置文件或者properties配置文件中。然而XML配置文件需要通过DOM或SAX方式解析,而读取properties配置文件就比较容易。因此今天宏哥讲解和分享如何读取properties配置文件的内容。2.properties文件......
  • Python+requests+Pytest+logging+allure+pymysql框架详解
    一、框架目录结构1)tools目录用来放公共方法存储,如发送接口以及读取测试数据的方法,响应断言数据库断言前置sql等方法;2)datas目录用例存储接口用例的测试数据,我是用excel来存储的数据,文件数据图片数据等;3)testcases目录用来存放测试用例,一个python文件对应一个接口模块的......
  • 软测WebUI Python安装selenium模块失败,用VSCode安装成功
    Dos命令行下Python安装selenium模块失败,安了python,pip也好着呢,安装失败,网上没有查到类似报错。  报错还有一些,截图不全使用vsc安装selenium模块,成功了。  ......