1. 目标
利用 Selenium抓取淘宝商品并用 pyquery解析得到商品的图片 、名称 、 价格、购买人数、店铺名称和店铺所在地信息,并将其保存到 MongoDB。
2.准备工作
Chrome 浏览器并配置好了 ChromeDriver;另外,还需要正确安装 Python 的 Selenium库;最后,还对接了 PhantomJS和 Firefox,请确保安装好 PhantomJS和 Firefox并配置好了 GeckoDriver。
3.分析接口
无法直接发现Ajax接口的参数(_ksTS,rn)的规律,所以用selenium来模拟浏览器,不用关注这些接口函数。
4.页面分析:
包含商品的基本信息,包括商品图片、名称、 价格、购买人数、店铺名称和店铺所在地。
抓取入口就是淘宝的搜索’页面,这个链接可以通过直接构造参数访问。
有一个分页导航,其中既包括前 5页的链接 ,也包括下一页的链接 ,同时还有一个输入任意页码跳转的链接
taobao.py
1 from selenium import webdriver 2 from selenium.webdriver.support.wait import WebDriverWait 3 from selenium.webdriver.support import expected_conditions as EC 4 from urllib.parse import quote 5 from selenium.webdriver.common.by import By 6 from selenium.common.exceptions import TimeoutException 7 import pymongo 8 from pyquery import PyQuery as pq 9 from config import * 10 11 12 browser = webdriver.Firefox() 13 #browser = webdriver.PhantomJS(service_args=SERVICE_ARGS) 14 15 \'\'\'chrome_options = webdriver.ChromeOptions() 16 chrome_options.add_argument(\'--headless\') 17 browser = webdriver.Chrome(chrome_options=chrome_options) 18 \'\'\' 19 20 wait = WebDriverWait(browser, 10) 21 client = pymongo.MongoClient(MONGO_URL) 22 db = client[MONGO_DB] 23 24 \'\'\' 25 MONGO_URL = \'localhost\' 26 MONGO_DB = \'taobao\' 27 MONGO_COLLECTION = \'products\' 28 MAX_PAGE = 100 29 client = pymongo.MongoClient(MONGO_URL) 30 db = client[MONGO_DB] 31 32 KEYWORD = \'iPad\' 33 \'\'\' 34 def index_page(page): 35 \'\'\' 36 抓取索引页 37 :param page: 38 :return: 39 \'\'\' 40 print("正在爬取第 ", page, "页") 41 try: 42 url = \'https://s.taobao.com/search?q=\' + quote(KEYWORD) 43 browser.get(url) 44 if page > 1:#判断页码 45 input = wait.until( 46 EC.presence_of_element_located((By.CSS_SELECTOR, \'#mainsrp-pager div.form > input\')) 47 ) 48 submit = wait.until( 49 EC.presence_of_element_located((By.CSS_SELECTOR, \'#mainsrp-pager div.form > span.btn J_Submit\')) 50 ) 51 input.clear() 52 input.send_keys(page) 53 submit.click() 54 wait.until( 55 EC.text_to_be_present_in_element((By.CSS_SELECTOR, \'#mainsrp-pager li.item.active > span\'), str(page)) 56 ) 57 wait.until( 58 EC.presence_of_element_located((By.CSS_SELECTOR, \'.m-itemlist .items .item\')) 59 #这个选择器对应的页面内容就是每个商品的信息块 60 ) 61 get_products() 62 except TimeoutException: 63 index_page(page) 64 65 def get_products(): 66 \'\'\' 67 提取商品数据 68 :return: 69 \'\'\' 70 html = browser.page_source#属性获取页码的源代码 71 doc = pq(html)#构造了 PyQuery解析对象 72 items = doc(\'#mainsrp-itemlist .items .item\').items() 73 for item in items: 74 #每次循环把它赋值为item变量, 75 #每个item变量都是一个PyQuery对象 76 product = { 77 \'image\': item.find(\'.pic .img\').attr(\'data-src\'), 78 \'price\': item.find(\'.price\').text(), 79 \'deal\': item.find(\'.deal-cnt\').text(), 80 \'title\': item.find(\'.title\').text(), 81 \'shop\': item.find(\'.shop\').text(), 82 \'location\': item.find(\'.location\').text() 83 } 84 print(product) 85 save_to_mongo(product) 86 87 def save_to_mongo(result): 88 \'\'\' 89 保存至DB 90 :param result: 91 :return: 92 \'\'\' 93 try: 94 if db[MONGO_COLLECTION].insert(result): 95 print(\'存储到MongoDB成功\') 96 except Exception: 97 print(\'存储到MongoDB失败\') 98 99 100 def main(): 101 """ 102 遍历每一页 103 """ 104 for i in range(1, MAX_PAGE + 1): 105 index_page(i) 106 browser.close() 107 108 if __name__ == \'__main__\': 109 main()
config.py
1 MONGO_URL = \'localhost\' 2 MONGO_DB = \'taobao\' 3 MONGO_COLLECTION = \'products\' 4 5 KEYWORD = \'ipad\' 6 7 MAX_PAGE = 100 8 9 SERVICE_ARGS = [\'--load-images=false\', \'--disk-cache=true\']
每次测试都需要拿手机扫描二维码登陆,并且一直爬取第一页,无法进入下一页。