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