python selenium 的使用——alibaba询盘
1、使用selenium打开浏览器
# 使用selenium打开浏览器
options = webdriver.ChromeOptions()
options.add_argument('--disable-extensions')
options.add_argument('--no-sandbox') # run Chrome use root
options.add_argument('--disable-setuid-sandbox')
options.add_argument('--disable-dev-shm-usage')
options.add_argument('--disable-gpu')
options.add_experimental_option('excludeSwitches', ['enable-automation'])
driver = webdriver.Chrome(options=options)
driver.maximize_window()
driver.get('https://www.google.com/')
time.sleep(5)
driver.find_element_by_css_selector("input[class='gLFyf gsfi']").send_keys("alibaba")
driver.find_element_by_css_selector("input[class='gLFyf gsfi']").send_keys(Keys.ENTER)
press_keys('esc')
return driver
搜索结果有几个都是官网,这里取第一个
ali_name = driver.find_elements_by_tag_name("a")
for h in ali_name:
if h.get_attribute('href') == "https://www.alibaba.com/":
h.click()
time.sleep(3)
press_keys('esc')
break
打开官网后搜索,需要滑到底部这样就可以一次性获取到一整页的48个左右的商品链接,再滑回顶部,比较好看。
滑到底部两次,是因为第一次滑到底部可能还在加载中,所以滑两次就肯定可以到底部。
search_name = driver.find_element_by_css_selector("input[class='ui-searchbar-keyword']")
search_name.send_keys("wigs")
driver.find_elements_by_css_selector("input[class='ui-searchbar-submit']")[0].click()#点搜索
press_keys('esc')
for n in range(20):
driver.execute_script('window.scrollTo(0,document.body.scrollHeight)') # 滑到底部
time.sleep(6)
driver.execute_script('window.scrollTo(0,document.body.scrollHeight)') # 滑到底部
time.sleep(6)
driver.execute_script('window.scrollTo(0,0)') #滑到顶部
time.sleep(3)
获取商品链接,如果需要直接打开这个链接就可以用driver.get(‘链接’),这里直接点击
product_link = driver.find_elements_by_css_selector("a[class='elements-title-normal one-line']") # 搜索结果所有名字
print(len(product_link ))
这里用 if in 来判断我想要打开链接是否在这个页面中 ,在的话就点击它,如果不在就随机点一个,点之前跳到该商品比较好看。
for index, d in enumerate(result_list): # 循环整个列表
if "https://www.alibaba.com/product-detail/Wig-Hd-Wigs-Wholesale-Hd-Bob_1600214030827.html" in d and d not in click_linklist:#判断链接是否为d,而且为没有点击过的
time.sleep(3)
driver.execute_script("arguments[0].scrollIntoView();", d) # 跳到该商品
time.sleep(3)
d.click()
click_linklist.append(d)
else:
if random.randint(2, 1000) < 3:
p = driver.find_elements_by_css_selector("a[class='elements-title-normal one-line']")[index]
driver.execute_script("arguments[0].scrollIntoView();", p) # 跳到该商品
p.click() # 随机点一个
driver.switch_to.window(driver.window_handles[-1])
else:
continue
因为是在主页点开的,所以这里就生成新的窗口页面,需要切换到这里再进行操作,否则下滑等操作就是对原窗口的操作并不是对新窗口的操作了。
进入商品页面之后,下滑浏览商品详情页,然后进行询盘。
driver.switch_to.window(driver.window_handles[-1])#切换到最新的窗口是最后一个
driver.close()#关闭当前窗口
driver.switch_to.window(driver.window_handles[0]) # 切换回主页句柄
for i in range(20): # 详情页下滑
driver.execute_script("window.scrollBy(0,1000)")
time.sleep(2)
driver.execute_script("arguments[0].scrollIntoView();", driver.find_element_by_css_selector(
"[class='content-container content-container-snoop']")) # 跳到输入框
这里就有输入框,单选框,发送按钮。这里需要注意的是单选框。
driver.find_element_by_css_selector("[class='content-container content-container-snoop']").find_element_by_name("content").send_keys("hihihihihihihihihihihihihi")
time.sleep(3)
s = driver.find_elements_by_css_selector("input[class='ui-checkbox ui-checkbox-system']")[0].is_selected()
# 是否选中状态
if s == False:
driver.find_elements_by_css_selector("input[class='ui-checkbox ui-checkbox-system']")[0].click()#单选框
time.sleep(3)
driver.find_element_by_css_selector("input[class='ui2-button ui2-button-primary ui2-button-large']").click()#发送
time.sleep(3)
driver.find_element_by_css_selector("li[class='sc-hd-prefix2-tab-trigger']").click()
time.sleep(3)
driver.find_element_by_css_selector("input[id='xjoinEmail']").send_keys("xxxxxxxxxx@gmail.com")
time.sleep(3)
driver.find_element_by_css_selector("input[id='xjoinPassword']").send_keys("ASDfgh123")
time.sleep(3)
driver.find_element_by_css_selector("input[id='xjoinFirstName']").send_keys("felixbo")
time.sleep(3)
driver.find_element_by_css_selector("input[id='xjoinLastName']").send_keys("man")
time.sleep(3)
driver.find_element_by_css_selector("span[class='sc-hd-prefix2-checkbox-customize-txt square-checkbox-box']").click()
time.sleep(3)
滑块
draggable = driver.find_element_by_id('nc_1__scale_text')
# 滚动指定元素位置
driver.execute_script("arguments[0].scrollIntoView();", draggable)
time.sleep(2)
ActionChains(driver).click_and_hold(draggable).perform()
# 拖动
ActionChains(driver).move_by_offset(xoffset=247, yoffset=0).perform()
ActionChains(driver).release().perform()
time.sleep(3)
点击登录sign in,是没有滑块的,当输入账号密码,就会有滑块。
这里需要注意的是要切进ifram,第一次切的是登录窗口的大ifram,第二次切的是滑块单独的ifram,中间是不需要切回去的,有多少个ifram,就直接切几个ifram,当最小的那个切完了,并且在ifram里的操作都完结,才需要切回原始的driver.switch_to_default_content()
driver.find_element_by_css_selector("li[class='sc-hd-prefix2-tab-trigger']").click()
time.sleep(1)
driver.switch_to_frame("alibaba-login-box") # 切换大iframe
driver.find_element_by_css_selector("input[id='fm-login-id']").send_keys("felixboman455@gmail.com")
time.sleep(1)
driver.find_element_by_css_selector("input[id='fm-login-password']").send_keys("QAZwsx1987")
time.sleep(1)
driver.switch_to_frame("baxia-dialog-content") # 切换小iframe
time.sleep(1)
# 加上滑块那段代码
time.sleep(1)
driver.find_element_by_css_selector("input[id='fm-login-submit']").click()#提交
time.sleep(3)
driver.switch_to_default_content() # 切回原始iframe
关闭当前窗口,切换回主窗口
driver.close()
driver.switch_to.window(driver.window_handles[0]) # 切换回主页句柄
点击下一页,如果存在下一页的按钮,就点击。
判断是否有提示语,如果有则为最后一页。
if 'class="seb-pagination__pages-link pages-next"' in driver.page_source: # 点下一页
p = driver.find_element_by_css_selector("a[class='seb-pagination__pages-link pages-next']")
driver.execute_script("arguments[0].scrollIntoView();", p)
p.click()
time.sleep(3)
else:
break
if " did not match any products. You may consider to:" in driver.page_source:
break