zoukankan      html  css  js  c++  java
  • 淘宝商品信息爬取

    源代码如下:

    import re
    import pymongo
    from pyquery import PyQuery as pq
    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
    from config import *
    
    client = pymongo.MongoClient(MONGO_URL)
    db = client[MONGO_DB]
    
    browser = webdriver.Chrome()
    wait = WebDriverWait(browser, 100)
    
    def search():
        try:
            browser.get("https://www.taobao.com/")
            input = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#q' )))
            # 一直等待,直到输入栏加载出来,等待时间不超过100秒
            submit = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,'#J_TSearchForm > div.search-button > button')))
            # 一直等待,直到按钮可以点击,等待时间不超过100秒
            input.send_keys('ipad')
            submit.click()
            total = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#mainsrp-pager > div > div > div > div.total')))
            # 一直等待,直到“共100页”的标签加载出来
            get_products()  # 获取加载页所有商品的信息,并保存到 mongodb
            return total.text
        except TimeoutException:  # 如果网络不好,加载超时,则重新调用search()方法
            return search()
    
    def next_page(page_number):  # 对其他页执行类似于 search() 的操作
        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()
            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:
            return next_page(page_number)
    
    def get_products():
        wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '#mainsrp-itemlist .items .item')))
        # 一直等待,直到商品信息加载出来
        html = browser.page_source
        # 获取浏览器当前的网址
        doc = pq(html)
        # 利用pyquery方法获取网页信息
        items = doc('#mainsrp-itemlist .items .item').items()
        for item in items:
            product = {
                'image': item.find('.pic .img').attr('src'),
                'price': item.find('.price').text(),       # 获取标签里的文字
                'deal': item.find('.deal-cnt').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('存储到MONGODB成功',result)
        except Exception:
            print('存储到MONGODB失败',result)
    
    def main():
        total = search()
        total = int(re.compile('(d+)').search(total).group(1))
        print(total)
        # for i in range(2, total + 1):    # 用于循环加载100个页面的信息
        #     next_page(i)
        browser.close()
    
    if __name__ == '__main__':
        main()

    困难一:刚开始一直按照崔庆才老师的视频教学编写程序,由于是2017年的教学视频,和现在的淘宝页面有些不太一样,每次点击搜索按钮都需要扫描登陆进去才行,结果更换页面后,搜索的 ‘’美食‘’ 就变成了繁体字,可能是不同加载页面的请求方式不同,前者是 Get 方法,后者是 Post 方法,造成字节编码错误。因此我就用英文搜索 ‘iphone’,就不会出现乱码了。 

    困难二:import pymongo 一直报错,网上查找方法,最后得知是需要新加一个 interpreter(解释器),经验证有效。我想这应该是我的python装在D盘, MongoDB 装在C盘的缘故吧。教学视频都是装在C盘就没这种问题。但现在提示说 No Python interpreter configured for the project,不过程序可以正常运行, 具体原因还在进一步探索。

    困难三:淘宝页面如果一直加载下一页的话,更到了十几页,就会报警提示,这应该是淘宝自己做的程序,目前还不会改进。

  • 相关阅读:
    循环语句 for , forin , forEach
    Haxe
    Haxe数据类型
    jango中间件的使用
    python的遍历模式
    python文件读写
    python3.5以上自带的虚拟环境在各种环境下的使用方法
    冒泡排序
    工厂方法模式
    redis 配置
  • 原文地址:https://www.cnblogs.com/zhangguoxv/p/9951369.html
Copyright © 2011-2022 走看看