zoukankan      html  css  js  c++  java
  • 使用Selenium模拟浏览器抓取淘宝商品美食信息

    1.搜索关键词:利用Selenium驱动浏览器,得到商品列表。

    2.分析页码并翻页:得到商品页码数,模拟翻页,得到后续页面的商品列表。

    3.分析提取商品内容:利用PyQuery分析源码,解析得到商品列表。

    4.存储到MongoDB:将商品列表信息存储到数据库MongoDB。

    spider.py

     1 from selenium import webdriver
     2 from selenium.common.exceptions import TimeoutException
     3 from selenium.webdriver.common.by import By
     4 from selenium.webdriver.support.ui import WebDriverWait
     5 from selenium.webdriver.support import expected_conditions as EC
     6 import re
     7 from pyquery import PyQuery as pq
     8 from urllib.parse import quote
     9 import pymongo
    10 from config import *
    11 
    12 client = pymongo.MongoClient(MONGO_URL)
    13 db = client[MONGO_DB]
    14 browser = webdriver.Chrome()
    15 wait = WebDriverWait(browser, 10)
    16 
    17 def search():
    18     try:
    19         browser.get('https://www.taobao.com')
    20         input = wait.until(
    21             EC.presence_of_element_located((By.CSS_SELECTOR, '#q'))
    22         )
    23         submit = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '#J_TSearchForm > div.search-button > button')))
    24         input.send_keys('美食')
    25         submit.click()
    26         total = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '#mainsrp-pager > div > div > div > div.total')))
    27         get_products()
    28         return total.text
    29     except TimeoutEXception:
    30         return search()
    31 
    32 def next_page(page_number):
    33     try:
    34         input = wait.until(
    35             EC.presence_of_element_located((By.CSS_SELECTOR, '#mainsrp-pager > div > div > div > div.form > input'))
    36         )
    37         submit = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '#mainsrp-pager > div > div > div > div.form > span.btn.J_Submit')))
    38         input.clear()
    39         input.send_keys(page_number)
    40         submit.click()
    41         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)))
    42         get_products()
    43     except TimeoutException:
    44         next_page(page_number)
    45 
    46 def get_products():
    47     wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '#mainsrp-itemlist .items .item')))
    48     html = browser.page_source
    49     doc = pq(html)
    50     items = doc('#mainsrp-itemlist .items .item').items()
    51     for item in items:
    52         product = {
    53             'image': item.find('.pic .img').attr('src'),
    54             'price': item.find('.price').text(),
    55             'deal': item.find('.deal-cnt').text()[:-3],
    56             'title': item.find('.title').text(),
    57             'shop': item.find('.shop').text(),
    58             'location': item.find('.location').text()
    59         }
    60         print(product)
    61         save_to_mongo(product)
    62 
    63 def save_to_mongo(result):
    64     try:
    65         if db[MONGO_TABLE].insert(result):
    66             print('保存MONGOBD成功',result)
    67     except Exception:
    68         print('存储到MONGODB失败',result)
    69 
    70 def main():
    71     total = search()
    72     total = int(re.compile('(d+)').search(total).group(1))
    73     for i in range(2,total+1):
    74         next_page(i)
    75     browser.close()
    76 
    77 if __name__ == '__main__':
    78     main()

    config.py

    1 MONGO_URL = 'localhost'
    2 MONGO_DB = 'taobao'
    3 MONGO_TABLE = 'products'

    从Chrome 59版本开始,已经开始支持Headless模式,也就是无界面模式,这样爬取的时候就不会弹出浏览器了。如果要使用此模式,请把Chrome升级到59版本及以上。启用Headless模式的方式如下:

    chrome_options = webdriver.ChromeOptions()
    chrome_options.add_argument('--headless')
    browser = webdriver.Chrome(chrome_options=chrome_options)

    首先,创建ChromeOptions对象,接着添加headless参数,然后在初始化Chrome对象的时候通过chrome_options传递这个ChromeOptions对象,这样我们就可以成功启用Chrome的Headless模式了。

    要对接Firefox浏览器,非常简单,只需要更改一处即可:

    browser = webdriver.Firefox()

    这里更改了browser对象的创建方式,这样爬取的时候就会使用Firefox浏览器了。

    如果不想使用Chrome的Headless模式,还可以使用PhantomJS(它是一个无界面浏览器)来抓取。抓取时,同样不会弹出窗口,还是只需要将WebDriver的声明修改一下即可:

    修改代码:

    client = pymongo.MongoClient(MONGO_URL)
    db = client[MONGO_DB]
    #browser = webdriver.Chrome()
    browser = webdriver.PhantomJS(service_args=SERVICE_ARGS)
    wait = WebDriverWait(browser, 10)
    browser.set_window_size(1400, 900)

     另外,它还支持命令行配置。比如,可以设置缓存和禁用图片加载的功能,进一步提高爬取效率:

    MONGO_URL = 'localhost'
    MONGO_DB = 'taobao'
    MONGO_TABLE = 'products'
    
    SERVICE_ARGS = ['--load-images=false', '--disk-cache=true']
  • 相关阅读:
    UVA1349 Optimal Bus Route Design 最优巴士路线设计
    POJ3565 Ants 蚂蚁(NEERC 2008)
    UVA1663 Purifying Machine 净化器
    UVa11996 Jewel Magic 魔法珠宝
    NEERC2003 Jurassic Remains 侏罗纪
    UVA11895 Honorary Tickets
    gdb调试coredump(使用篇)
    使用 MegaCLI 检测磁盘状态并更换磁盘
    员工直接坦诚直来直去 真性情
    山东浪潮超越3B4000申泰RM5120-L
  • 原文地址:https://www.cnblogs.com/wanglinjie/p/9114218.html
Copyright © 2011-2022 走看看