淘宝商品信息爬取

源代码如下:

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,不过程序可以正常运行, 具体原因还在进一步探索。

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

 

posted @ 2018-11-13 11:40  *精灵鼠*  阅读(422)  评论(0编辑  收藏  举报