淘寶可以說是一個檢驗(yàn)爬蟲技術(shù)是否過關(guān)的最強(qiáng)關(guān)卡了赡若,下面來打破它吧肃拜。
淘寶的所有操作差不多都是在登錄的狀態(tài)下進(jìn)行的,這時候想要對淘寶進(jìn)行請求獲取信息就必須在登錄的狀態(tài)下進(jìn)行了咆课。
方式一:(selenium)
使用selenium模塊棍厂,使用自動化模塊進(jìn)行爬取淘寶颗味,對自己需要的信息進(jìn)行爬取下來,這是一個很簡單的方式牺弹,但是這也是一個效率比較低下的爬蟲形式浦马。這個簡單的自動化爬取形式就不詳細(xì)講解了。但是有一個值得注意的點(diǎn)就是登陸的時候例驹,會被檢測出內(nèi)容輸入的速度過快捐韩,之后彈出一個滑動驗(yàn)證條,需要對驗(yàn)證條進(jìn)行處理才能夠登陸成功鹃锈。
方式二:(requests)
使用requests模塊荤胁,對淘寶頁面發(fā)起請求,但是在發(fā)起請求之前就需要攜帶上淘寶賬號的cookies信息屎债,如果沒有攜帶cookies信息仅政,那么對淘寶發(fā)起的所有請求都沒有任何有用信息返回垢油。
1. selenium簡介
使用selenium模塊,使用自動化模塊進(jìn)行爬取淘寶圆丹,對自己需要的信息進(jìn)行爬取下來滩愁,這是一個很簡單的方式,但是這也是一個效率比較低下的爬蟲形式辫封。這個簡單的自動化爬取形式就不詳細(xì)講解了硝枉。但是有一個值得注意的點(diǎn)就是登陸的時候,會被檢測出內(nèi)容輸入的速度過快倦微,之后彈出一個滑動驗(yàn)證條妻味,需要對驗(yàn)證條進(jìn)行處理才能夠登陸成功。
1.1 針對瀏覽器的主要操作方法:
創(chuàng)建瀏覽器對象:driver = webdriver.xxx()
窗口最大化:maximize_window()
獲取瀏覽器尺寸:get_window_size()
設(shè)置瀏覽器尺寸:set_window_size()
獲取瀏覽器位置:get_window_position()
設(shè)置瀏覽器位置:set_window_position(x,y)
關(guān)閉當(dāng)前標(biāo)簽/窗口:close()
關(guān)閉所有標(biāo)簽/窗口:quit()
1.2 selenium定位元素
因?yàn)閟elenium是模仿真實(shí)點(diǎn)擊瀏覽器的行為欣福,所以必須要先定位網(wǎng)頁元素责球,才能進(jìn)行各種操作。
「定位頁面元素的8種主要方式」
id定位:driver.find_element_by_id(value)
name屬性值定位:driver.find_element_by_name(value)
類名定位:driver.find_element_by_class_name(value)
標(biāo)簽名定位:driver.find_element_by_tag_name(value)
鏈接文本定位:driver.find_element_by_link_text(value)
部分鏈接文本:driver.find_element_by_partial_link_text(value)
xpath路徑表達(dá)式:driver.find_element_by_xpath(value)
css選擇器:driver.find_element_by_css_selector(value)
1.3 selenium操作網(wǎng)頁
定位元素后拓劝,需要對網(wǎng)頁進(jìn)行各種操作雏逾,比如點(diǎn)擊、刷新郑临、保存等栖博。
點(diǎn)擊展開新的頁面,點(diǎn)擊方法:element.click()
其他主要操作方法:
請求某個url:driver.get(url)
刷新頁面操作:refresh()
回退到之前的頁面:back()
前進(jìn)到之后的頁面:forward()
獲取當(dāng)前訪問頁面url:current_url
獲取當(dāng)前瀏覽器標(biāo)題:title
保存圖片:get_screenshot_as_png()/get_screenshot_as_file(file)
網(wǎng)頁源碼:page_source
2. 爬取流程
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time, datetime, random
# 創(chuàng)建Chrome瀏覽器對象厢洞,這會在電腦中打開一個窗口
browser = webdriver.Chrome('C:/Users/dell/Downloads/chromedriver_win32 (1)/chromedriver.exe')
wait = WebDriverWait(browser, 10)
# 保存圖片笛匙;
def savepic():
basepath = 'F:/test/'
filename = "{:%Y%m%d%H%M%S}-{:03}.png".format(datetime.datetime.now(), random.randint(1,100))
browser.save_screenshot(basepath+filename)
# 生成頁面快照并保存
def search():
browser.get('https://www.taobao.com/')
input = wait.until(
EC.presence_of_element_located((By.CSS_SELECTOR, "#q"))
) # 選擇輸入框
# 點(diǎn)擊搜索按鈕
submit = WebDriverWait(browser, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, '#J_TSearchForm > div.search-button > button')))
time.sleep(1)
input.send_keys('美食')
time.sleep(1)
submit.click()
# login
input_username = wait.until(EC.presence_of_element_located(
(By.CSS_SELECTOR, 'div.fm-field > div.input-plain-wrap.input-wrap-loginid > input')))
input_password = wait.until(EC.presence_of_element_located(
(By.CSS_SELECTOR, 'div.fm-field > div.input-plain-wrap.input-wrap-password > input')))
input_login = wait.until(EC.presence_of_element_located(
(By.CSS_SELECTOR, '#login-form > div.fm-btn > button')))
input_username.send_keys('*******')
print('賬戶名輸入完成')
time.sleep(1)
input_password.send_keys('*******')
print('密碼輸入完成')
# input_password.send_keys(Keys.ENTER)
time.sleep(1)
# 等待登錄按鈕
input_login.click()
print('登錄成功!')
def main():
search()
if __name__ == '__main__':
main()
顯示出搜索頁了
翻頁:輸入每一頁 頁碼,不使用下一頁犀变,防止出錯;
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from pyquery import PyQuery as pq
from config import *
import time, datetime, random, re, pymongo
# 創(chuàng)建Chrome瀏覽器對象秋柄,這會在電腦中打開一個窗口
browser = webdriver.Chrome('C:/Users/dell/Downloads/chromedriver_win32 (1)/chromedriver.exe')
wait = WebDriverWait(browser, 10)
client = pymongo.MongoClient(MONGO_URL)
db = client[MONGO_DB]
def search():
try:
browser.get('https://www.taobao.com/')
input = wait.until(
EC.presence_of_element_located((By.CSS_SELECTOR, "#q"))
) # 選擇輸入框
# 點(diǎn)擊搜索按鈕
submit = WebDriverWait(browser, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, '#J_TSearchForm > div.search-button > button')))
time.sleep(1)
input.send_keys('美食')
time.sleep(1)
submit.click()
# login
input_username = wait.until(EC.presence_of_element_located(
(By.CSS_SELECTOR, 'div.fm-field > div.input-plain-wrap.input-wrap-loginid > input')))
input_password = wait.until(EC.presence_of_element_located(
(By.CSS_SELECTOR, 'div.fm-field > div.input-plain-wrap.input-wrap-password > input')))
input_login = wait.until(EC.presence_of_element_located(
(By.CSS_SELECTOR, '#login-form > div.fm-btn > button')))
input_username.send_keys('')
print('賬戶名輸入完成')
time.sleep(1)
input_password.send_keys('')
print('密碼輸入完成')
# input_password.send_keys(Keys.ENTER)
time.sleep(1)
# 等待登錄按鈕
input_login.click()
print('登錄成功!')
# 頁數(shù)
total = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '#mainsrp-pager > div > div > div > div.total')))
get_products()
return total.text
except TimeoutException:
return search() # 超時重新請求获枝;
def next_page(page_number):
try:
input = wait.until(
EC.presence_of_element_located((By.CSS_SELECTOR, '#mainsrp-pager > div > div > div > div.form > input')))
submit = wait.until(
EC.element_to_be_clickable((By.CSS_SELECTOR, '#mainsrp-pager > div > div > div > div.form > span.btn.J_Submit')))
input.clear()
input.send_keys(page_number)
submit.click()
time.sleep(2)
# 判斷是否翻頁成功
wait.until(EC.text_to_be_present_in_element(
(By.CSS_SELECTOR, '#mainsrp-pager > div > div > div > ul > li.item.active > span'), str(page_number)))
get_products()
except TimeoutException:
next_page(page_number)
def get_products():
# 寶貝信息
wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '#mainsrp-pager .items .item')))
html = browser.page_source
doc = pq(html)
items = doc('#mainsrp-pager .items .item').items()
for item in items:
product = {
'image': item.find('.pic .img').attr('src'),
'price': item.find('.price').text(),
'deal': item.find('.deal-cnl').text()[:-3],
'title': item.find('.title').text(),
'shop': item.find('.shop').text(),
'location': item.find('.location').text()
}
print(product)
save_to_mongo(product)
def save_to_mongo(result):
try:
if db[MONGO_TABLE].insert(result):
print('保存到mongo_DB成功', result)
except Exception:
print('保存到mongo失敗', result)
def main():
total = search()
total = int(re.compile('(\d+)').search(total).group())
for i in range(2, 3):
next_page(i)
print(total)
if __name__ == '__main__':
main()
# config.py
MONGO_URL = 'localhost'
MONGO_DB = 'taobao'
MONGO_TABLE = 'product'
聲明:本爬蟲僅供學(xué)習(xí), 若被他人用于商業(yè)用途與本人無關(guān)骇笔!