用selenium爬取各大购物网站

双“11”一天的临近,它既是购物者的狂欢,也是卖家的狂欢。囤积已久的购物车在那天将被清空,鼓鼓的钱包将会被掏空。我不知道你们是否已经装满了购物车,反正我的购物车已经满满的啦!!!又是一年剁手季。

《用selenium爬取各大购物网站》
《用selenium爬取各大购物网站》

双十一满满的都是套路,小编我年年中招,快递慢得要死,价格贵得要死,最后穷得要死,反正是生不如死。

《用selenium爬取各大购物网站》
《用selenium爬取各大购物网站》

今年,小编不甘心再中招,突然有了新想法,在节前爬取了自己想要商品的价格,等到双11的时候,我再爬一次,看你是真涨了,还是降低了(纯属玩笑,估计那天网络特卡,别增加服务器压力,搞崩溃犯法了不好,只供学习,不然后果自负)。

废话不多说了,现在来看看干货:

from selenium import webdriver
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import re
from pyquery import PyQuery as pq
browser=webdriver.Firefox()
wait=WebDriverWait(browser,10)
def search():
    browser.get('http://www.dangdang.com/')
    try:
        input=wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '#key_S')))
        submit=wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '#form_search_new > input.button')))
        input.clear()
        input.send_keys('R语言')
        submit.click()
        total=wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '#go_sort > div > div.data > span:nth-child(3)')))
        get_product()
        return total.text
    except TimeoutException:
        print('链接超时')
        return search()
def next_page(page_number):
    try:
        input = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "#t__cp")))
        submit = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "#click_get_page")))
        input.clear()
        input.send_keys(page_number)
        submit.click()
        browser.implicitly_wait(20)
        wait.until(EC.text_to_be_present_in_element((By.CSS_SELECTOR, ".current"),str(page_number)))
        get_product()
    except TimeoutException:
        next_page(page_number)

def get_product():
    wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '#search_nature_rg .bigimg')))
    html = browser.page_source
    doc = pq(html)
    items = doc('#search_nature_rg .bigimg').items()
    for item in items:
        product = {
            'name':item.find('p.name').text(),
            'detail':item.find('p.detail').text(),
            'new_price':item.find('p.price span.search_now_price').text(),
            'old_price':item.find('p.price span.search_pre_price').text(),
            'discount':item.find('p.price span.search_discount').text(),
            'shop':item.find('p.dang').text(),
            'commit':item.find('p.search_star_line a.search_comment_num').text(),
            'author':item.find('p.search_book_author').text(),
            'img':item.find('a.pic').attr('src'),
            'lianjie':item.find('a.pic').attr('href')
        }
        print(product)

def main():
    try:
        total=int(search()[1:])
        print(total)
        for i in range(2,total+1):
            next_page(i)
    except Exception:
        print("*****出现异常******")
    finally:
        browser.close()


if __name__ == '__main__':
    main()

以上代码亲测,可以直接运行,前提是你得配置好selenium和火狐浏览器。

除此之外,还爬取了京东、淘宝、天猫等购物网站,具体代码可以留言获取,这里就不展示了。

    原文作者:紫丁香
    原文地址: https://zhuanlan.zhihu.com/p/30639304
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞