任务
爬取https://www.aliexpress.com/wholesale?SearchText=cartoon+case&d=y&origin=n&catId=0&initiative_id=SB_20200523214041这个页面下的商品详情,由于页面是异步加载的,需要使用Selenium模拟浏览器来获取商品url。但直接使用Selenium定位网页元素速度又很慢,因此需要结合Re或者BeautifulSoup来提高爬取效率。
模拟登陆
使用Selenium模拟登录,登录成功后获取cookie。
def login(username, password, driver=None):
driver.get('https://login.aliexpress.com/')
driver.maximize_window()
name = driver.find_element_by_id('fm-login-id')
name.send_keys(username)
name1 = driver.find_element_by_id('fm-login-password')
name1.send_keys(password)
submit = driver.find_element_by_class_name('fm-submit')
time.sleep(1)
submit.click()
return driver
browser = webdriver.Chrome()
browser = login('Wheabion1944@dayrep.com','ab123456',browser)
browser.get('https://www.aliexpress.com/wholesale?trafficChannel=main&d=y&SearchText=cartoon+case<ype=wholesale&SortType=default&page=')
这个网站对用户监管不严,使用邮箱注册都不需要进行验证,可以用这个网站获取假邮箱进行注册:http://www.fakemailgenerator.com/
其实后续真正运行程序爬的时候并没有登录,爬了十页也没碰到反爬。
获取商品详情页的URL
这一过程需要解决的问题在于该网页是ajex异步加载的,网页不会在打开的同时加载全部数据,在下拉的同时网页刷新返回新的数据包并渲染,因此通过request无法一次性读到网页的全部源码。解决思路是通过Selenium来模拟浏览器下拉行为以获取一页内全部的数据,然后暂时还是通过sel去获取元素。
登录后打开任务需要的页面会出现广告弹窗,首先需要关闭广告弹窗:
def close_win(browser):
time.sleep(10)
try:
closewindow = browser.find_element_by_class_name('next-dialog-close')
browser.execute_script("arguments[0].click();", closewindow)
except Exception as e:
print(f"searchKey: there is no suspond Page1. e = {e}")
模拟下拉行为并获取一页中全部商品的url:
def get_products(browser):
wait = WebDriverWait(browser, 1)
for i in range(30):
browser.execute_script('window.scrollBy(0,230)')
time.sleep(1)
products = wait.until(EC.presence_of_all_elements_located((By.CLASS_NAME,"product-info")))
if len(products) >= 60:
break
else:
print(len(products))
continue
products = browser.find_elements_by_class_name('product-info')
return products
后来经学长指点发现不需要这么麻烦,搜索页的商品信息虽然是经过下滑操作才会通过JS动态渲染,但商品信息其实都是写在html文档里的,可以通过以下方式获取:
url = 'https://www.aliexpress.com/wholesale?trafficChannel=main&d=y&SearchText=cartoon+case<ype=wholesale&SortType=default&page='
driver