淘宝商品信息爬取
源代码如下:
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,不过程序可以正常运行, 具体原因还在进一步探索。
困难三:淘宝页面如果一直加载下一页的话,更到了十几页,就会报警提示,这应该是淘宝自己做的程序,目前还不会改进。